'''对象族谱之类对象实例化过程'''
class Person(object):
'''获取对象方法'''
def __new__(cls, *args, **kwargs):
'''
对象获取要点之一: 获取
当外部进行类名方法调用时,会调用__new__方法获取对象实例
但只是获取,并不一定是创建,也可以返回已经存在的一个对象
返回的对象也不一定是当前类的实例对象,可以是任何在python中可以称作是对象的东西
'''
# return 3 可以返回一个int对象,也可以是任何其他对象
'''
对象获取要点之二: 创建
python中创建类实例对象的方法只有一种,object.__new__(cls),cls表示创建的对象依附的类名称
当子类当中省略该方法时,会自动追寻到父类,调用父类的__new__方法进行创建,层级追溯,直到追溯到type中调用的object.__new__方法
由此可见,所有的类实例对象都是同样的原型体,唯一的区别在于以下三点:
1.类名
绑定类名,类之间类名不同
2.属性
类初始化__init__中定义的属性不同,不同类属性存在差异
3.方法
类中定义的方法不同,行为不一致
所以可以说:
对象都是相同的原型,通过类赋予了归属名称,属性和方法才产生了区分
(对象名称是程序员规定,不在族谱谈论范围)
'''
return object.__new__(cls)
'''对象初始化方法'''
def __init__(self):
'''
对象初始化要点之一: 初始化对象
进行初始化操作,针对的是当前类的实例对象,确切的说是__new__返回的对象
直接调用self指定当前对象实例,通过点(.)指定属性,直接进行赋值初始化
对象初始化要点之二: 赋予属性
为__new__方法返回的实例对象添加属性,有以下三种差异:
1.非当前类对象,但是拥有指定的同名属性
通过self.attr进行赋值,能够成功,属性值会被赋予的新属性值覆盖,此对象不属于该类
2.非当前类对象,不拥有指定的属性名称
执行失败
3.当前类对象初始化
如果__new__的返回值确定是当前类的对象,必然是object.__new__(cls)生成的原型体
直接self.attr进行赋值操作,相当于为原型体添加指定的属性
原型体的属性添加完毕之后,可以被赋予不同的值,但是属性一直存在,除非调用del进行删除
'''
self.name = 'judas'
'''对象方法调用执行方法'''
def __call__(self, *args, **kwargs):
'''
类实例对象进行方法调用时执行此方法
但是一般分作两种场合:
1.一般类定义
一般类当中,该方法属于DIY自定义方法,除非工作当中有明确的规则定义,否则一般都可以随便定义
自定义操作范围:
参数的个数也可以自己定义,操作随意
可以带返回值,也可以不带返回值
任意操作,一般方法允许的操作都适用
2.元类定义
元类是类的类,元类的实例对象是一个类,当类名进行方法调用时必须返回一个对象
至于是创建新的对象还是移植一个已经存在的对象不做细节要求,同一般类定义中的__new__方法
不过这不是一个良好的编程习惯,不推荐瞎鸡巴玩
此方法一般不做要求,可以看做是调用方式比较特殊的对象行为方法定义
但是在元类定义中,需要谨慎对待,符合规格
'''
print('__call__')
对象族谱之类对象实例化过程
最新推荐文章于 2023-06-22 23:26:35 发布