Python中的类属性与实例属性

在Java中类的实例属性和类属性区别是很明显的,用static表示类属性,这种属性在内存中只有一份副本,但是在Python中这种区别不那么明显。

举个例子,如何计算一个类创建的实例数量?

class Person:
    count = 0

    def __init__(self):
        Person.count += 1
        print(Person.count)
        print(self.count)
        self.count += 1
        print(Person.count)
        print(self.count)


p1 = Person()
p2 = Person()

运行结果:

1
1
1
2
2
2
2
3

从结果可以看到Person.count代表类属性,只有一份,self.count在第一次调用时继承Person.count,然后成为实例属性,每次一个新对象初始化时实例的self.count都会取Person.count的当前值,所以Python是用Class.attribute和self.attribute区分类属性和实例属性的

所以上面的答案是

class Person:
    count = 0

    def __init__(self):
        Person.count += 1
        print(Person.count)

更深入一点来说,self代表的是类的本身实例变量,如下代码

class Test:
    def ppr():
        print(self)

t = Test()
t.ppr()

Traceback (most recent call last):
  File "main.py", line 64, in <module>
    t.ppr()
TypeError: ppr() takes 0 positional arguments but 1 was given

 t.ppr实际上是类的方法Test.ppr(t),它传入了参数实例t,而ppr参数数量为0,所以报错

这样就明白了,实例方法调用时是自动传入实例作为参数的,而类中定义方法默认第一个的self是用来接收实例的,这样就说得通了

另一方面,如果我们的定义和调用时均不传类实例,这样是可以的,类中的方法不加self,那就是类方法,应该用类名调用,使用实例调用会报上面的错误,类调用会报“方法必须有第一个形参,通常叫做 'self'”,但是可以正常运行,这里就是Python中的类方法与实例方法的区别。

class Test:
    a=1234
    def ppr():
        print(Test.a)

Test.ppr()

运行结果:
1234

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值