概述
定义一个类,
"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__
:使用print
和str
时。
repr用于所有其他环境:用于交互模式下提示回应以及repr
函数。然而要注意,如果没有定义__str__
,print
和str
会使用__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
网友评论