19. __ new __
当使用“类名”([实参])创建实例对象时,Python解释器的主要处理过程包括两大类:
- 调用特殊方法__new__()创建实例对象
首先会查找该类对象是否实现了此特殊方法,如果没有实现,则去其父类中以此查找。直到类对象object - 调用特殊方法__init__()对创建的实例对象进行初始化
__ new __ ()返回的实例对象会作为实参被自动传递给__init__()的第一个形参self
class Parent(object):
def __new__(cls, *arg, **kwargs):
print("父类的__new__被调用,其形参cls对应的id:",id(cls))
obj = super().__new__(cls)
print("创建的实例对象的id:",id(obj))
return obj
class Child(Parent):
def __init__(self, name):
#__new__返回的obj会作为实参传递给__init__的第一个形参self
print("子类的__init__()被调用,其形参self对应的id:",id(self))
self.name = name
child = Child("Mike")
父类的__new__被调用,其形参cls对应的id: 68401464
创建的实例对象的id: 95546840
子类的__init__()被调用,其形参self对应的id: 95546840
20. getitem()、setitem()、delitem()
自定义类对象的实例对象,在默认情况下,是不能像列表和字典那样使用中括号语法来操作数据的
如果想让自定义类对象的实例对象可以像列表和字典那样,使用中括号语法来操作数据,必须在自定义类对象中实现以下特殊方法:
1. getitem(self,key)
当执行操作obj[key]时,会自动调用该特殊方法获取数据
2. setitem(self,key,value)
当执行操作obj[key] = value时,会自动调用该特殊方法设立数据
3. delitem(self,key)
当执行操作del obj[key]时,会自动调用该特殊方法删除数据
class MyDict(object):
def __init__(self):
self.data = {}
#必须定义下列三种特殊方法 不然会报错
def __getitem__(self, key):
return self.data[key]
def __setitem__(self, key, value):
self.data[key] = value
def __delitem__(self, key):
del self.data[key]
md = MyDict()
md["one"] = 18
md["two"] = 32
print(md.data)
{'one': 18, 'two': 32}
del md["two"]
print(md.data)
{'one': 18}
md['one']
18
21. __ call __ 与 callable
1. __ call__
若在类对象中实现了特殊方法__call__(),那么就可以像调用函数一样直接调用这个类对象的实例对象,从而会自动调用特殊方法__call__()
class MyClass(object):
def __call__(self, age, *args, **kwargs):
print(args, kwargs)
mc = MyClass()
# 10占据了age参数,返回元组和字典
#参考博客链接 (函数的参数传递):https://mp.csdn.net/mdeditor/89349712#
mc(10, 2, 6, 8, name = 'Tom', hobby = 'music')
(2, 6, 8) {'name': 'Tom', 'hobby': 'music'}
2. callable:
内置函数callable用于判断指定对象是否可调用
除了函数对象是可调用的之外,对于实现了特殊方法__call__()的类对象,其实例对象也是可调用的
#内置函数可调用
callable(print)
True
#自定义函数可调用
def fun():
pass
callable(fun)
True
#自定义实现特殊方法__ call __类对象的实例对象可调用
callable(MyClass())
True
22. __ doc __ 与__ dict __
1. __ doc __用于表示类对象的文档字符串
- 类对象的文档字符串
与函数的文档字符串类似,位于类对象的第一行的字符串被称为类对象的文档字符串,通常用三个引号表示,类对象的文档字符串是对类对象的功能的简要描述
class MyClass(object):
"""
这是类对象的文档字符串
aa bb cc
"""
pass
- 访问类对象的文档字符串
通过类对象的特殊属性__doc__可以访问类对象文档字符串
print(MyClass.__doc__)
这是类对象的文档字符串
aa bb cc
调用内置函数help()得到帮助类函数的文档字符串
help(MyClass)
Help on MyClass in module __main__ object:
class MyClass(builtins.object)
| 这是类对象的文档字符串
| aa bb cc
|
| Data descriptors defined here:
|
| __dict__
| dictionary for instance variables (if defined)
|
| __weakref__
| list of weak references to the object (if defined)
2. __ dict __
对于指定的类对象或实例对象,通过访问特殊方法__dict__可以获得该类对象或实例对象绑定的所有方法和属性的字典。其中字典的键为方法名或属性名
class MyClass(object):
ca = 'ca'
def __init__(self):
self.ia = 'ia'
def im(self):
pass
@classmethod
def cm(cls):
pass
@staticmethod
def sm():
pass
#访问类对象所绑定的所有属性和方法
MyClass()
MyClass.ca2 = 'ca2'
MyClass.__dict__
mappingproxy({'__dict__': <attribute '__dict__' of 'MyClass' objects>,
'__doc__': None,
'__init__': <function __main__.MyClass.__init__>,
'__module__': '__main__',
'__weakref__': <attribute '__weakref__' of 'MyClass' objects>,
'ca': 'ca',
'ca2': 'ca2',
'cm': <classmethod at 0x5bc60f0>,
'im': <function __main__.MyClass.im>,
'sm': <staticmethod at 0x5bc6128>})
#绑定实例对象
mc = MyClass()
mc.ia2 = 'ia2'
print(mc.__dict__)
{'ia': 'ia', 'ia2': 'ia2'}