zoukankan      html  css  js  c++  java
  • Python面向对象类的特殊成员方法

    类的特殊成员方法:
    1.__doc__ : 打印类下面的注释

    2.__module__和__class__:
    from lib.aa import C
    输出类被导出的模块名lib.aa,输出类的模块名和类名<class lib.aa.C>

    3.__init__和__del__
    注:析构方法一般无须定义,因为Python是一门高级语言,程序员在使用时无需关心内存的分配和释放,因为此工作都是交给Python解释器来执行,
    所以,析构函数的调用是由解释器在进行垃圾回收时自动触发执行的

    4.__call__ 对象后面加括号,触发执行。
    注:构造方法的执行是由创建对象触发的,即:对象 = 类名() ;而对于 __call__ 方法的执行是由对象后加括号触发的,即:对象() 或者 类()()

    class Foo(object):
        def __init__(self):
            print("__init__")
        def __call__(self, *args, **kwargs):
            print("__call__")
    
    
    f = Foo()  #输出__init__
    f()        #输出__call__

    5.__dict__方法,查看类或对象中所有成员字典形式

    class Province:
     
        country = 'China'
     
        def __init__(self, name, count):
            self.name = name
            self.count = count
     
        def func(self, *args, **kwargs):
            print 'func'
     
    # 获取类的成员,即:静态字段、方法、
    print Province.__dict__
    # 输出:{'country': 'China', '__module__': '__main__', 'func': <function func at 0x10be30f50>, '__init__': <function __init__ at 0x10be30ed8>, '__doc__': None}
     
    obj1 = Province('HeBei',10000)
    print obj1.__dict__
    # 获取 对象obj1 的成员
    # 输出:{'count': 10000, 'name': 'HeBei'}
     
    obj2 = Province('HeNan', 3888)
    print obj2.__dict__
    # 获取 对象obj1 的成员
    # 输出:{'count': 3888, 'name': 'HeNan'}

    6.__str__:打印对象的时候,打印返回__str__的返回值

    class Dog(object):
        def __init__(self, name):
            self.name = name
            self.__food = None
        def __str__(self):
            return self.name
    
    d = Dog("labuladuo")
    print(d)  # labaladuo

    7.__getitem__、__setitem__、__delitem__:字典封装成一个实例,对用户来说以为访问的是字典,实际上是实例,可以进行权限控制等

    class Foo(object):
        def __getitem__(self, key):
            print('__getitem__', key)
    
        def __setitem__(self, key, value):
            print('__setitem__', key, value)
    
        def __delitem__(self, key):
            print('__delitem__', key)
    
    
    obj = Foo()
    
    result = obj['k1']  # 自动触发执行 __getitem__
    obj['k2'] = 'alex'  # 自动触发执行 __setitem__
    del obj['k1']       # 自动触发执行 __delitem__

    8。__new__和__metaclass__

    #type创建Foo
    #普通方式:
    
    class Foo(object):    
        def __init__(self,name)
            self.name=name    
        def fun(self):
            print("func.....",self.name)
     
    #特殊方式:
    def __init__(self,name)
        self.name=name
    
    def func(self):
        print("func.....")
    
    Foo = type("Foo",(object,),{"fun":func,
                                "__init__":__init__})
    f = Foo("alex")
    f.fun()

    Foo类本身也是一个对象,那么Foo类对象应该也是通过执行某个类的 构造方法 创建。可以看出是type类

    So ,记住,类 是由 type 类实例化产生

    那么问题来了,类默认是由 type 类实例化产生,type类中如何实现的创建类?类又是如何创建对象?

    答:类中有一个属性 __metaclass__,其用来表示该类由 谁 来实例化创建,所以,我们可以为 __metaclass__ 设置一个type类的派生类,从而查看 类 创建的过程。

    f=Foo()的过程可以看做,先创建Foo对象,再调用它的metaclass中的__call__方法。Python2中的特性

  • 相关阅读:
    记ArcGIS Android V100.4加载天地图不显示的问题
    arcgis性能检测记录
    python数据更新
    python批量definition query
    从天地图下载瓦片构建本地瓦片地图
    android studio问题备注
    android studio报butterknife错误
    openPose-注
    视觉工程师现场调试手册
    human pose estimation
  • 原文地址:https://www.cnblogs.com/revo/p/7398191.html
Copyright © 2011-2022 走看看