python类的特殊成员方法

module

表示当前操作的对象在哪个模块,即所在包的包名,若不在包中,则为”main“。

1
2
3
4
from A.B import C

c = C()
print(c.__module__) # A.B

class

表示当前操作的对象的类是什么。

1
2
3
4
from A.B import C

c = C()
print(c.__class__) # A.B.C

initdel

__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() # 输出:init del

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() # 输出:1 2

实质上说,这意味着 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__)
# 输出:{'a': 1, 'b': 2, 'x': <bound method A.add of <__main__.A object at 0x000001D8D9AB8E80>>}

print(A.__dict__)
# 输出:{'a':1, 'b':2, '__module__': '__main__', '__init__': <function A.__init__ at 0x0000023824F69B80>, 'add': <function A.add at 0x0000023824F78040>, '__dict__': <attribute '__dict__' of 'A' objects>, '__weakref__': <attribute '__weakref__' of 'A' objects>, '__doc__': None}

str

如果一个类中定义了__str__ 方法,那么在打印对象时,默认输出该方法的返回值。

1
2
3
4
5
6
class A:
def __str__(self) -> str:
return "hello world"

a = A()
print(a) # 输出: hello world

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']) # 输出:silence

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)) # 输出:3

a.x = 10
print(a.x) # 输出:10

我们先在 A 类的初始化函数中实例化一个 B 类的对象 a,然后将 a 作为 getattr 方法的参数,那么当执行 a.add(1, 2) 时,发现 A 类中并没有这个属性,这时就会自动调用 getattr 方法,从对象 a 对应的类 B 中调用 add 方法。

注意:getattr 方法一定是在本类中找不到属性时才会调用。

setattr 方法通过 dict 实现。因为对象的属性都保存在 dict 中,那么通过向 dict 中添加属性就可以实现向对象中添加属性。