zoukankan      html  css  js  c++  java
  • Python 类描述符-Descriptor

    # 类的特殊成员

      类中有字段、方法和属性三大类成员,并且成员名前如果有两个下划线,则表示该成员是私有成员,私有成员只能由类内部调用。

    # 详情如下:

    1. __doc__

      表示类的描述信息

    2. __module__ 和  __class__ 

      __module__ 表示当前操作的对象在哪个模块

      __class__     表示当前操作的对象的类是哪个模块下的哪个类

    3. __init__

      构造方法,通过类创建对象时,自动触发执行

    4. __del__

      析构方法,当对象在内存中被释放时,自动触发执行。

      注:此方法一般无须定义,因为Python是一门高级语言,程序员在使用时无需关心内存的分配和释放,

        因为此工作都是交给Python解释器来执行,所以,析构函数的调用是由解释器在进行垃圾回收时自动触发执行的。

    5. __dict__

      类或对象中的所有成员都存放在__dict__中

    6. __call__

      可以让实例化后的对象在后面加括号,触发执行。

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

    class A(object):
        """
        测试类 A,用于各种类的功能测试。
        """
    
        def __init__(self, name):
            self.name = name
    
        def say(self):
            print("I Love: " + self.name)
    
        def __call__(self, *args, **kwargs):
            if args:
                print(args)
            if kwargs:
                print(kwargs)
            print("Call...")
    
        def __del__(self):
            pass
    
    
    if __name__ == '__main__':
        a = A("Python")
        a()
        print(a.__dict__)
        print(a.__doc__)
    
    

    >> 执行结果 Call... {'name': 'Python'} 测试类 A,用于各种类的功能测试。

    7. __str__

      如果一个类中定义了__str__方法,那么在实例化对象时,就会自动执行__str__ , __str__ 期待的是return。

    class A(object):
        """
        测试类 A,用于各种类的功能测试。
        """
    
        def __init__(self, name):
            self.name = name
    
        def say(self):
            print("I Love: " + self.name)
    
        def __str__(self):
            return "hello python"
    
    
    if __name__ == '__main__':
        a = A("Python")
        print(a)
    
    >> 执行结果
    hello python

    8、__getitem__、__setitem__、__delitem__

      以字典的形式操作类的属性,以上分别表示获取、设置、删除属性。

    9、__iter__ 

      用于迭代器,之所以列表、字典、元组可以进行for循环,是因为类型内部定义了 __iter__ .

    10. __new__ 和 __metaclass__

    阅读以下代码:

    class Foo(object):
     
        def __init__(self):
            pass
     
    obj = Foo()   # obj是通过Foo类实例化的对象
    

    上述代码中,obj 是通过 Foo 类实例化的对象,其实,不仅 obj 是一个对象,Foo类本身也是一个对象,因为在Python中一切事物都是对象

    如果按照一切事物都是对象的理论:obj对象是通过执行Foo类的构造方法创建,那么Foo类对象应该也是通过执行某个类的 构造方法 创建。

    print(type(obj)) # 输出:<class '__main__.Foo'>     表示,obj 对象由Foo类创建
    print(type(Foo)) # 输出:<type 'type'> 表示,Foo类对象由 type 类创建

    所以,obj对象是Foo类的一个实例Foo类对象是 type 类的一个实例,即:Foo类对象 是通过type类的构造方法创建。

    --> 类 是由 type 类实例化产生

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

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

    new最开始执行,然后再执行init, 最后执行 call

     

  • 相关阅读:
    10月日常练习1题目描述
    普及组复赛历年考题
    9.3练习题7 子串乘积正负分类 题解
    9.3练习题6 旅行 题解
    9.3练习题4 语句解析 题解
    9.3练习题5 单词覆盖还原 题解
    unity
    矩阵快速幂
    点权和
    SCOI生日快乐
  • 原文地址:https://www.cnblogs.com/vincenshen/p/6080295.html
Copyright © 2011-2022 走看看