python杂记
python面向对象之类变量与对象变量
- 类变量(Class Variable)是共享的(Shared)——它们可以被属于该类的所有实例访问。该类变量只拥有一个副本,当任何一个对象对类变量作出改变时,发生的变动将在其它所有实例中都会得到体现。
- 对象变量(Object variable)由类的每一个独立的对象或实例所拥有。在这种情况下,每个对象都拥有属于它自己的字段的副本,也就是说,它们不会被共享,也不会以任何方式与其它不同实例中的相同名称的字段产生关联。
# coding=UTF-8
class Robot:
"""表示一个带有名字的机器人"""
#记录机器人的数量
population = 0
def __init__(self, name):
"初始化数据"
self.name = name
print("(Initializing {})".format(self.name))
#创建一个机器人人口加1
Robot.population += 1
def die(self):
"我挂了"
print("{} is being destoryed!".format(self.name))
Robot.population -= 1
if Robot.population == 0:
print("{} was the last one.".format(self.name))
else:
print("There are still {:d} robots working.".format(Robot.population))
def say_hi(self):
"""来自机器人的问候
没问题你做得到。"""
print("Gretings, my masters call me {}".format(self.name))
@classmethod
def how_many(cls):
"打印当前的人口数量"
print("We have {:d} robots.".format(cls.population))
droid1 = Robot("aaa")
droid1.say_hi()
Robot.how_many()
droid2 = Robot("bbb")
droid2.say_hi()
Robot.how_many()
print("\nRobots can do some work here.\n")
print("Robot have finished their work. So let's destory them.")
droid1.die()
droid2.die()
Robot.how_many()
population 属于Robot类,因此它是一个类变量。 name变量属于一个对象(通过使用self 分配),因此它是一个对象变量。因此,我们通过Robot.population而非self.population引用population类变量。我们对于name对象变量采用self.name标记法加以称呼,这是这个对象中所具有的方法。要记住这个类变量与对象变量之间的简单区别。
除了Robot.popluation ,我们还可以使用self.class.population ,因为每个对象都通过self.class 属性来引用它的类。how_many实际上是一个属于类而非属于对象的方法。这就意味着我们可以将它定义为一个classmethod(类方法)或是一个staticmethod(静态方法) ,这取决于我们是否需要知道这一方法属于哪个类。由于我们已经引用了一个类变量,因此我们使用classmethod(类方法) 。