zoukankan      html  css  js  c++  java
  • python中的类(二)

    python中的类(二)

    六、类的成员

    字段:普通字段,静态字段

    eg:

    class Province():
    
          country=’中国’  #静态字段,保存在类中,执行时可以通过类或对象访问
    
          def __init__(self,name):
    
                 self.name=name             #普通字段,保存在对象中,只能通过对象访问
    
     
    
    print(Province.country)         #中国,通过类访问
    
    obj=Province(‘河南’)
    
    print (obj.name)                    #河南,通过对象访问
    
    print(obj.country)             #中国,通过对象访问

    方法:普通方法,静态方法,类方法

    应用场景:

    普通方法:对象中需要保存一些值,执行某功能时,需要使用对象中的值

    静态方法:不需要任何对象中的值

    eg:

    class Foo():
    
          def f1(self):         #普通方法,保存在类中,由对象调用,形参self指调用的对象
    
                 print(123)
    
          @staticmethod
    
          def f2(a1):    #静态方法,self不是必须的形参,保存在类中,可以通过类直接调用
    
                 print(a1)
    
          @classmethod
    
          def f3(cls):   #类方法,形参cls指当前类名,所以可以通过类访问
    
                 print

    属性

    属性实际是方法,只是在在调用时不像调用方法那样在方法名后加括号。

    class Foo():
    
          @propery           #用于执行obj.f4
    
          def f4(self):
    
                 print (789)
    
          return 1
    
     
    
          @f4.settr                    #用于执行obj.f4=123
    
          def f4(self,val)
    
                 print(val)
    
     
    
          @f4.deleter        #用于执行del obj.f4
    
          def f4(self):
    
                 print(111)
    
    调用:
    
    obj=Foo()          #创建对象
    
    r=obj.f4                    #调用属性
    
    print (r)              #789
    
                               #1
    
    obj.f4=123         #123
    
    del obj.f4                  #111

    成员修饰符

    类的成员分为共有成员和私有成员。共有成员可以直接访问,而私有成员不可以外部直接访问。

    共有成员:

    以前创建的成员均为共有成员。

    私有成员:

    在创建成员时,在成员名前添加两个下划线即可。私有成员虽然外部无法直接访问,但是可以在类的内部访问。父类中的私有成员,子类也不可直接使用。

    class Person ( ):
    
          def __init__(self,name,age):
    
                 self.name=name      #共有成员
    
                 self.__age=age  #私有成员
    
         
    
          def show():
    
                 print ( self.__age)
    
    F=Person(‘tom’,18)
    
    F.show()                    #18,通过类内部访问
    
    F.name              #tom,通过外部访问

    特殊成员

    __call__

    class Call:
    
        def __call__(self, *args, **kwargs):
                 print (‘ok’)
    
    #调用方法一
    
    F=Call()
    
    F()         #执行__call__方法,输出ok
    
    #调用方法二
    
    Call()()         #执行__call__方法,输出ok

    __str__

    一般在print时使用。若不加此方法,print该类的对象时,显示的是该类的内存地址。

    eg:

    class F():
    
          def __init__(self,n,a):
    
                 self.name=n
    
                 self.age=a
    
          def __str__(self):
    
                 return self.name
    
    #调用
    
          A=F(’tom’,18print (A)              #tom,执行时类似于print(str(A)),str(A)会自动调用F中的str方法,并获取其返回值

    __del__(析构方法)

    在该类的对象被销毁时,执行。

    __getiterm__

    通过索引取值。

    eg:

    class Person():
        def __init__(self, name, age):
            self.name = name
            self.__age = age
        def __getitem__(self, item):
            return item+10
    F=Person('tom',18)
    print (F[2])   #12,自动执行F对象类中__getitem__方法。

    __setiterm__

    通过索引赋值。

    eg:

    class Person():
    
        def __init__(self, name, age):
    
            self.name = name
    
            self.__age = age
    
        def __setitem__(self, key, value):
    
        print (key,value)
    
    F=Person('tom',18)
    F[3]=222  #3 222,自动执行F对象类中__setitem__方法。

    __iter__

    如果类中有__iter__方法,则该对象时可迭代对象

    对象.__iter__()的返回值是迭代器

    for循环遇到可迭代对象,则自动执行对象.__iter__(),生成迭代器,进行for循环。

    eg:

    class Person():
    
        def __init__(self, name, age):
    
            self.name = name
    
            self.__age = age
    
        def __iter__(self):
    
            return iter([11, 22, 33])
    F=Person('tom',18)
    for i in F:
        print(i)

    metaclass

    class F1(type):
        def __init__(self,what,bases=None,dict=None):
            super(F1, self).__init__(what,bases,dict)
            print (1)
        def __call__(self):
            print (2)
            self.__new__(self)
            self.__init__(self)
    class S(object,metaclass=F1):
        def __new__(cls, *args, **kwargs):
            pass
        def __init__(self):
            print (3)

    输出结果为:

    1

    2

    3

     
  • 相关阅读:
    辅助随笔:因知识点不足暂时错过的题目
    NOIP2019翻车前写(and 抄)过的代码
    NOIP2019翻车前计划以及日记
    Luogu P3706 [SDOI2017]硬币游戏
    Luogu P5296 [北京省选集训2019]生成树计数
    Luogu P3307 [SDOI2013]项链
    Gaussian整数
    Problem. S
    LOJ6696 复读机 加强版
    数据库约束
  • 原文地址:https://www.cnblogs.com/xshan/p/8544536.html
Copyright © 2011-2022 走看看