内建的魔法属性(方法)

概述

定义一个类,

"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

你可能感兴趣的:(内建的魔法属性(方法))