类中的方法有三种(实例方法,类方法和静态方法),同样主要的类属性也有三种,分别是公有属性、私有化属性和受保护属性,本文主要来看看这三种属性的定义和使用区别。
一、公有属性、私有化属性和受保护属性的定义
公有属性、私有化属性和受保护属性的定义主要是在属性名上有所区别,类属性就不用多说了,之前的课程中使用的都是公有属性,受保护属性在定义属性名的时候前面加上一个下划线'_',私有属性加2个下划线'__'。
# x _y __z
class Person:
name = 'Tom' # 公有属性
_age = 18 # 受保护属性
__sex = '男' # 私有属性
注意:python语言中没有真正意义上的私有属性,但是可以通过下划线完成一种伪私有效果。
私有化属性:为了部分属性的安全,给类属性设定一个限制,让此属性只能在类的内部进行访问,实例化的对象无法访问。私有化属性本质就是把之前访问权限从一个较大的范围给压缩到一个指定的范围。一般的公有类属性访问可以通过类中的方法访问,对象访问,类直接访问。私有属性只能在类的内部访问。
二、访问属性
class Person:
name = 'Tom' # 公有属性
_age = 18 # 受保护属性
__sex = '男' # 私有属性
def func(self):
print(Person.name)
print(self.name)
print(Person._age)
print(self._age)
print(Person.__sex)
print(self.__sex)
# 在类的内部访问公有属性,私有属性和受保护属性都行
p = Person()
p.func()
print('*' * 50)
print(Person.name)
print(p.name)
print(Person._age) # 强行访问受保护属性的时候会有黄色波浪线来警告
print(p._age)
print(Person.__sex) # AttributeError: type object 'Person' has no attribute '__sex'
print(p.__sex) # AttributeError: 'Person' object has no attribute '__sex'
从结果可以看出来,从类的外部通过类和对象只能访问公有属性和受保护属性。
总结:
- 公有属性:通过类的内部,对象调用,子类调用,模块之间的调用都能访问
- 受保护的属性:通过类的内部可以访问,对象调用,子类调用,模块调用也能强行访问,但是有黄色波浪线警告提示
- 私有属性:一般只能在类的内部访问,