- 变量名前加_(单下划线),例如
_XXX :该变量的类型为protected,类本身和其子类可以访问,子类可继承。 - 变量名后加_(单下划线),例如
XXX_ :常用于避免变量名与关键字冲突。 - 变量名前加__(双下划线),例如
__XXX :该变量的类型为private,类内可访问,外部不可访问,子类不可继承。 - 变量名前后都加__(双下划线),例如
__XXX__ :该变量为魔法方法,会在对类的某个操作时自动调用,比如创建一个类对象时,执行c=C()语句,python就会自动调用C类里的__init__方法和__new__方法。
补充(描述符协议):
若需要在类外访问私有变量(__XXX 形式的变量),可通过定义描述符来实现。 描述符本质上就是一个新式类,实现了描述符协议的类就是一个描述符。描述符协议:在类里实现了 __get__() 、__set__() 和__delete__() 中的一个或多个方法,其中,__get__() :访问属性时调用该方法,返回属性值,若属性不存在或不合法将抛出对应异常;__set__() :设置属性时调用该方法,不返回任何内容;__delete__() :删除属性时调用该方法,不返回内容。
class Score:
def __init__(self, default=0):
self._score = default
def __set__(self, instance, value):
if not isinstance(value, int):
raise TypeError('Score must be integer')
if not 0 <= value <= 100:
raise ValueError('Valid value must be in [0, 100]')
self._score = value
def __get__(self, instance, owner):
return self._score
def __delete__(self):
del self._score
class Student:
Chinese = Score()
Math = Score()
English = Score()
def __init__(self, Name, Chinese, Math, English):
self.Name = Name
self.Chinese = Chinese
self.Math = Math
self.English = English
def __repr__(self):
return "<Student:{}, Chinese:{}, Math:{}, English:{}>".format(self.Name, self.Chinese, self.Math, self.English)
S1 = Student("Happy_Newmoon",61,71,81)
print(S1)
|