[关闭]
@tingyuge 2016-08-21T13:08:31.000000Z 字数 1475 阅读 1466

Python 类属性与方法

Python


Python的访问限制

Python支持面向对象,其对属性的权限控制通过属性名来实现,如果一个属性有双下划线开头(__),该属性就无法被外部访问。

  1. class Person:
  2. def __init__(self, name, age, sex):
  3. self.name = name
  4. self._age = age
  5. self.__sex = sex
  6. def out_name(self):
  7. print self.name
  8. def _out_age(self):
  9. print self._age
  10. def __out_sex(self):
  11. print self.__sex
  12. xiaohong = Person('xiaohong', 20, 1)
  13. print 'name'
  14. xiaohong.out_name()
  15. print xiaohong.name
  16. print 'age'
  17. xiaohong._out_age()
  18. print xiaohong._age
  19. print 'sex'
  20. # 以下两句报错
  21. xiaohong.__out_sex() # AttributeError: Person instance has no attribute '__outSex'
  22. xiaohong.__sex # AttributeError: Person instance has no attribute '__sex'

可以看到,以双下划线开头的变量无法在类外被访问。

当然以单下划线开头的变量能够被外界访问,然而在一般规范中,将正常变量作为类变量,将单下划线开头的变量作为实例变量。

类变量与实例变量

类变量就是在类的实例之间能够共享变量值的变量,实例变量就是该实例具有的变量。也就说,实例变量每个实例各自拥有,互相独立,而类变量有且只有一份。
具体可以参见:

  1. # coding=utf-8
  2. class aa:
  3. # w就是一个类变量,为该类的实例对象所共有,需要在定义时就进行赋值
  4. w = 10
  5. def __init__(self):
  6. self._x = 11
  7. self._y = 12
  8. def add(self):
  9. return self._x + self._y
  10. a = aa()
  11. print a.add()
  12. # 改变类变量的值
  13. aa.w = 20
  14. # 设置实例中实例变量的值,将覆盖类变量的值
  15. a.w = 13
  16. print aa.w, a.w # 输出20 13
  17. del a.w
  18. print a.w # 输出20
  19. # 设置实例变量
  20. a._t = 14
  21. a._q = 15
  22. print a._t, a._q # 输出14 15
  23. # 设置类变量,该类的所有实例对象共有
  24. aa.m = 30
  25. aa.n = 40
  26. print aa.m, aa.n # 输出30 40
  27. b = aa()
  28. print b._x,b._y
  29. # print b._t,b._q # 该句报错,因为b对象没有属性t,q
  30. print b.m,b.n # 25.26行设置了类变量m,n,输出30 40
  31. print b.w # 在14行已经改变了w的值,输出20

实例方法与类方法

和属性变量一样,方法也分为实例方法与类方法。
class内部定义的全部是实例方法,实例方法的第一个参数是self代表的是实例本身。
要在class中定义类方法,需要使用@classmethod修饰说明,参数也不在是self,而是cls.

  1. class Person:
  2. __count = 0
  3. def __init__(self, name):
  4. self._name = name
  5. Person.__count += 1
  6. @classmethod
  7. def how_many(cls):
  8. return cls.__count
  9. print Person.how_many() # 输出 0
  10. p1 = Person('Bob')
  11. print Person.how_many() # 输出1
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注