@tingyuge
2016-08-21T13:08:31.000000Z
字数 1475
阅读 1751
Python
Python支持面向对象,其对属性的权限控制通过属性名来实现,如果一个属性有双下划线开头(__),该属性就无法被外部访问。
class Person:def __init__(self, name, age, sex):self.name = nameself._age = ageself.__sex = sexdef out_name(self):print self.namedef _out_age(self):print self._agedef __out_sex(self):print self.__sexxiaohong = Person('xiaohong', 20, 1)print 'name'xiaohong.out_name()print xiaohong.nameprint 'age'xiaohong._out_age()print xiaohong._ageprint 'sex'# 以下两句报错xiaohong.__out_sex() # AttributeError: Person instance has no attribute '__outSex'xiaohong.__sex # AttributeError: Person instance has no attribute '__sex'
可以看到,以双下划线开头的变量无法在类外被访问。
当然以单下划线开头的变量能够被外界访问,然而在一般规范中,将正常变量作为类变量,将单下划线开头的变量作为实例变量。
类变量就是在类的实例之间能够共享变量值的变量,实例变量就是该实例具有的变量。也就说,实例变量每个实例各自拥有,互相独立,而类变量有且只有一份。
具体可以参见:
# coding=utf-8class aa:# w就是一个类变量,为该类的实例对象所共有,需要在定义时就进行赋值w = 10def __init__(self):self._x = 11self._y = 12def add(self):return self._x + self._ya = aa()print a.add()# 改变类变量的值aa.w = 20# 设置实例中实例变量的值,将覆盖类变量的值a.w = 13print aa.w, a.w # 输出20 13del a.wprint a.w # 输出20# 设置实例变量a._t = 14a._q = 15print a._t, a._q # 输出14 15# 设置类变量,该类的所有实例对象共有aa.m = 30aa.n = 40print aa.m, aa.n # 输出30 40b = aa()print b._x,b._y# print b._t,b._q # 该句报错,因为b对象没有属性t,qprint b.m,b.n # 25.26行设置了类变量m,n,输出30 40print b.w # 在14行已经改变了w的值,输出20
和属性变量一样,方法也分为实例方法与类方法。
在class内部定义的全部是实例方法,实例方法的第一个参数是self代表的是实例本身。
要在class中定义类方法,需要使用@classmethod修饰说明,参数也不在是self,而是cls.
class Person:__count = 0def __init__(self, name):self._name = namePerson.__count += 1@classmethoddef how_many(cls):return cls.__countprint Person.how_many() # 输出 0p1 = Person('Bob')print Person.how_many() # 输出1