module
表示当前操作的对象在哪个模块,即所在包的包名,若不在包中,则为”main“。
1 2 3 4
| from A.B import C
c = C() print(c.__module__)
|
class
表示当前操作的对象的类是什么。
1 2 3 4
| from A.B import C
c = C() print(c.__class__)
|
init ,del
__init__:构造方法,通过类创建对象时,自动触发执行。
__del__:析构方法,当对象在内存中被释放时,自动触发执行
创建对象后,Python 解释器默认调用 init 方法。当删除一个对象时,Python 解释器也会默认调用 del 方法。
一般情况下,创建了一个类的对象之后,如果该对象在之后的代码中不会被调用,那么 python 的内存管理机制会自动删除它。
1 2 3 4 5 6 7
| class A: def __init__(self): print('init') def __del__(self): print('del') a = A()
|
call
call() 允许一个类的实例像函数一样被调用。看如下例子:
1 2 3 4 5 6 7 8 9 10
| class A: def __init__(self, a, b) -> None: self.a = a self.b = b
def __call__(self): print(self.a, self.b) a = A(1, 2) a()
|
实质上说,这意味着 a() 与 a.call() 是相同的。
dict
类名.__dict__:查看类中的所有成员。
对象.__dict__:查看对象中的所有成员。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| class A: a = 1 b = 2 def __init__(self, a, b) -> None: self.a = a self.b = b self.x = self.add
def add(self): return self.a + self.b a = A(1, 2) print(a.__dict__)
print(A.__dict__)
|
str
如果一个类中定义了__str__ 方法,那么在打印对象时,默认输出该方法的返回值。
1 2 3 4 5 6
| class A: def __str__(self) -> str: return "hello world" a = A() print(a)
|
getitem__,__setitem__,__delitem
使得对象能够以字典的方式获取、设置、删除数据。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| class A: def __init__(self) -> None: self.dic = { 'name': 'silence', 'age': 22 }
def __getitem__(self, key): return self.dic[key]
def __setitem__(self, key, value): self.dic[key] = value
def __delitem__(self, key): del self.dic[key] a = A()
print(a['name'])
a['sex'] = 'male' del a['age']
|
getattr__,__setattr
python 提供了诸多的魔法方法,比如 getattr 可以将其他类中的属性为自己所用,setattr 允许向对象中添加属性。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| class B: @classmethod def add(cls, a, b): return a+b
class A: def __init__(self) -> None: self.a = B()
def __getattr__(self, name): return getattr(self.a, name)
def __setattr__(self, __name: str, __value) -> None: self.__dict__[__name] = __value a = A() print(a.add(1, 2))
a.x = 10 print(a.x)
|
我们先在 A 类的初始化函数中实例化一个 B 类的对象 a,然后将 a 作为 getattr 方法的参数,那么当执行 a.add(1, 2)
时,发现 A 类中并没有这个属性,这时就会自动调用 getattr 方法,从对象 a 对应的类 B 中调用 add 方法。
注意:getattr 方法一定是在本类中找不到属性时才会调用。
setattr 方法通过 dict 实现。因为对象的属性都保存在 dict 中,那么通过向 dict 中添加属性就可以实现向对象中添加属性。