python从__new__开始(2)由cls 和 self决定的

我还发现一个问题就是,我们一般的的类都是self必写。而__new__写的是cls,他们有什么不同。

查了一波资料,cla主要用于类定义方法,而self则是实例方法。

个人理解,当运行到这个方法的时候,类如果还没实例化,就是cls,否则是self。

接着下面给一个例子

class ClsTest:
	def __init__(self):
		print('init')		
		print(self)

	@classmethod
	def whoAmI(cls):
		print('cls')
		print(cls)

test = ClsTest()
test.whoAmI()
print(test.__class__)

返回值为

init
<__main__.ClsTest object at 0x7f18431ac0f0>
cls
<class '__main__.ClsTest'>
<class '__main__.ClsTest'>

先讨论下结果

很显然cls和test.__class__的返回值是一样的,说明他只是类而self已经是实例化的对象了。

那么他们决定了什么?

class Foo:
    def __new__(cls):
        print('__new__')
        print(cls)
        print(super().__new__(cls))
        return super().__new__(cls)
    def __init__(self):
        print('__init__')
        print(self)
foo = Foo()
print(foo)

执行结果

__new__
<class '__main__.Foo'>
<__main__.Foo object at 0x03F137B0>
__init__
<__main__.Foo object at 0x03F137B0>
<__main__.Foo object at 0x03F137B0>

从例子可以看出

先执行__new__方法,再执行__init__方法。实例化是在__new__中完成的,进入__init__时,self已经实例化了。

在上例中,cls和self只是个名字,貌似(我测试的是这样)写什么都可以,他需要在那个位置,用这样一个名字只是为了区别,当前的对象是什么。如果对象在metaclass中我们用mcs。

静态方法和类方法

class Foo:
    def foo1(self):
        print(self)
    @staticmethod
    def foo2():
        print("foo2")
    @classmethod
    def foo3(cls):
        print(cls)

f = Foo()
f.foo1()
f.foo2()
f.foo3()

返回结果

<__main__.Foo object at 0x05AE3830>
foo2
<class '__main__.Foo'>

这里也是一组调用,Foo中有常规调用,静态方法和类方法。类方法要传cls返回是一个class实例,静态方法不能传self。

我们也可以从这里看到他们的不同。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值