zoukankan      html  css  js  c++  java
  • Python档案袋( 面向对象 )

    类即是一个模型,根据模型建立起不同的对象,对象间拥有共同的一些属性

    简单的类:

     1 class P:
     2     #类变量,所有实例共享变量,推荐使用方法是:类名.类变量名
     3     pvarx="ppvar1"
     4 
     5     #构造函数
     6     def __init__(self,valuex):
     7         #实例变量,只属于当前实例
     8         self.valuex=valuex
     9 
    10     #类方法
    11     def pfun1(self):
    12         print("类方法1输出",self.valuex,P.pvarx)
    13 
    14     #析构函数,先生成,先死亡
    15     def __del__(self):
    16         print("再见,实例:",self)
    17 
    18 #创建对象,类的实例化
    19 p1=P("传递参数")
    20 
    21 #调用类变量
    22 P.pvarx="11222333"
    23 
    24 #调用类方法
    25 p1.pfun1()
    26 
    27 #删除对象,变量等,直接使用del()
    28 #del p1

    类变量和实例变量:

    类变量:

    类及所有实例共享变量,推荐使用方法是 【类名.变量名】

    实例变量(self.变量名):

    只属于当前实例

    注意:

    如果同名且用实例调用时,则优先寻找到实例变量

    使用实例调用并修改类变量值时,只能修改自己的,不影响整体

    类方法使用全局变量:

    Global声明变量为外部变量,表示可以长久修改外部变量,不写则只能使用,不能修改

     1 varx=1 #外部变量
     2 
     3 class XX:
     4     def funx(self):
     5         #global varx #声明为外部变量,表示可以长久修改外部变量,不写则只能使用
     6         varx=111
     7         print("------",varx) #输出:111
     8 
     9 x=XX()
    10 x.funx()
    11 print(varx) #输出:1

    类属性的私有化

    私有变量:

    在变量前加两个下划线即可,如【self.__变量名】,只能在类内访问,不能在类外通过实例访问

    私有方法:

    在类方法名前加入两个下划线,如【def __方法名(self){}】,使用与上相同

    类的继承:

    类可以实现多继承,多继承则可以用逗号分隔类名,如:子类名(父类1,父类2),继承的执行时从左到右,在列子中是先执行父类1,然后执行父类2
     1 class P:
     2     pvarx="ppvar1"
     3 
     4     #类构造方法
     5     def __init__(self,var1x):
     6         print(var1x)
     7     #类方法
     8     def pfun1(self):
     9         print("PPPPPP")
    10 
    11 #继承P类
    12 class P1(P):
    13     #重写父类的方法
    14     def pfun1(self):
    15         #P.pfun1(self) #调用父类的方法1
    16         print("p1p1p1p1p1p1",P1.pvarx)
    17 
    18 p1=P1("ppp111")#实例化
    19 p1.pfun1()
    20 P.pfun1(p1)#调用父类的方法2
    构造函数:
    如果子类有自己的构造函数,则必须在子类构造函数里调用父类的构造函数,如果父类的构造函数参数为空,则可忽略。使用下列方法1可以实现多继承效果,一句就可以实现多个父类的构造函数,只是其中父类的构造函数参数必须相同
    def __init__(self,v1,v2,v3):
        #super(P1,self).__init__(v1) #执行父类构造函数方法一
        #P(v1) #执行父类构造函数方法二
        P.__init__(self,v1) #方法三
        print(v1,v2,v3)

    实例变量的继承:

    父类中可以访问子类的实例变量
    class P:
        #类方法
        def pfun1(self):
            print("PPPPPP",self.p1var)
    
    #继承P类
    class P1(P):
        def __init__(self,p1v):
            self.p1var=p1v
    
    
    p1=P1(11111)#实例化
    p1.pfun1() #输出:PPPPPP 11111

    多态

    一个方法的多种实现,通过传递实例对象,实现调用实例中对应的方法
    def pto(obj):
        obj.funx()

    静态方法:

    通过类名调用,与实例无关
    class P:
    
       @staticmethod
       def funx(varpx):
           print("-----------",varpx)
    
    P.funx("dongxiaodong")

    类内方法:

    不可访问实例变量,只能访问类变量:
    class P:
        #类变量
       classvarx="112233"
    
       def __init__(self):
           self.xvar="类方法不可访问此实例变量"
    
       #类内方法
       @classmethod
       def funx(self,varpx):
           print("-----------",varpx,self.classvarx)
    
    p1=P()
    p1.funx("dongxiaodong")

    属性方法:

    调用简单,调用时如同使用变量
    class P:
    
       #属性方法
       @property
       def funx(self):
           print("-----------")
    
    p1=P()
    p1.funx  #调用,如同变量调用
    内容补充:
     1 class P:
     2    funxvar11x="xxxx"
     3    
     4    #属性方法
     5    @property
     6    def funx(self):
     7        print("-----------",P.funxvar11x)
     8 
     9    @funx.setter
    10    def funx(self,funxvar11):
    11        P.funxvar11x=funxvar11
    12 
    13    @funx.deleter
    14    def funx(self):
    15        del P.funxvar11x
    16 
    17 p1=P()
    18 p1.funx #输出:----------- xxxx
    19 p1.funx="1122"  #赋值
    20 p1.funx #输出:----------- 1122
    21 
    22 del p1.funx #删除

    类的一些特殊方法

     1 class P:
     2  def __call__(self, *args, **kwargs):
     3      print("----call----",args)
     4 
     5 p1=P()
     6 
     7 p1("11",22) #对象加括号传递参数,自动调用类中的call方法
     8 print(p1.__class__) #得到所属类名
     9 
    10 print(P.__dict__) #类名调用,打印类里的所有属性
    11 print(p1.__dict__) #实例调用,打印实例的所有属性

    反射

     1 class P:
     2  def pfunx(self, name):
     3      print("---- pfunx ----",name)
     4 
     5 p1=P()
     6 
     7 if hasattr(p1,"pfunx"): #判断对象里是否有某个方法
     8     funx=getattr(p1,"pfunx") #得到改方法的内存地址
     9     funx("dongxiaodong") #调用该方法
    10 
    11     setattr(p1,"pvar","112233") #设置实例变量值,没有则新建实例变量
    12     print(getattr(p1,"pvar")) #使用实例变量
    13     delattr(p1, "pvar")  # 删除实例变量
  • 相关阅读:
    【NOIP 2003】 加分二叉树
    【POJ 1655】 Balancing Act
    【HDU 3613】Best Reward
    【POJ 3461】 Oulipo
    【POJ 2752】 Seek the Name, Seek the Fame
    【POJ 1961】 Period
    【POJ 2406】 Power Strings
    BZOJ3028 食物(生成函数)
    BZOJ5372 PKUSC2018神仙的游戏(NTT)
    BZOJ4836 二元运算(分治FFT)
  • 原文地址:https://www.cnblogs.com/dongxiaodong/p/10495168.html
Copyright © 2011-2022 走看看