美文网首页
内建的魔法属性(方法)

内建的魔法属性(方法)

作者: 奥特曼255 | 来源:发表于2018-04-25 09:02 被阅读0次

    概述

    定义一个类,

    "testclass.py"
    
    
    class Person(object):
        pass
    

    在交互模式下输入:

    form testclass import Person
    
    dit(Person)
    

    等待输出,便可以看到 Python 所有的内建属性。
    比如:

    属性 说明 触发方式
    __new__ 生成实例 创建实例时
    __init__ 构造初始化函数 创建实例后,赋值时使用,在__new__
    __class__ 实例所在的类 实例.__class__
    __str__ 实例字符串表示,可读性 print(类实例),如没实现,使用repr结果
    __repr__ 实例字符串表示,准确性 类实例 回车 或者 print(repr(类实例))
    __del__ 析构 del删除实例
    __dict__ 实例自定义属性 vars(实例.__dict__)
    __doc__ 类文档,子类不继承 help(类或实例)
    __getattribute__ 属性访问拦截器 访问实例属性时
    __bases__ 类的所有父类构成元素 类名.__bases__

    常用属性详解

    • 显示格式 __repr____str__
      默认的交互模式回显(repr)打印(str),这两个函数都会把任意对象变换成它们的字符串表示。
      __str__:使用 printstr 时。
      repr用于所有其他环境:用于交互模式下提示回应以及 repr 函数。然而要注意,如果没有定义 __str__printstr 会使用 __repr__,但反过来并不成立。

    • __init____new__
      new是创建,init是初始化。
      创建对象时,先new后init。

    • __class__
      查看对象所属的类

    • __getattribute__

    class Itcast(object):
        def __init__(self,subject1):
            self.subject1 = subject1
            self.subject2 = 'cpp'
    
        #属性访问时拦截器,打log
        def __getattribute__(self,obj):
            if obj == 'subject1':
                print('log subject1')
                return 'redirect python'
            else:   #测试时注释掉这2行,将找不到subject2
                return object.__getattribute__(self,obj)
    
    
    s = Itcast("python")
    print(s.subject1)
    print(s.subject2)
    

    运行结果:

    log subject1
    redirect python
    cpp
    

    __getattribute__的坑

    class Person(object):
            def __getattribute__(self,obj):
                print("---test---")
                if obj.startswith("a"):
                    return "hahha"
                else:
                    return self.test
    
    
            def test(self):
                print("heihei")
    
    
        t = Person()
    
        t.a #返回hahha
    
        t.b #会让程序死掉
            #原因是:第7行,获取 self.test 的值时,等于调用 t.test , 那么就会跳转到 __getattribute__ 方法去执行,即此时产生了递归调用
            #
            # 注意:不要在 __getattribute__ 方法中调用 self.xxxx
    

    相关文章

      网友评论

          本文标题:内建的魔法属性(方法)

          本文链接:https://www.haomeiwen.com/subject/qghelftx.html