在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