1.先总结一下python对
_
下划线的特殊变量命名
关于包的导入这个博客写的挺好
_xxx
以单下划线命名,约定为(保护变量),即保护类型只能允许其本身与子类进行访问.但是你执意要访问也可以通过._xxx
访问,如果你这么写from <module/package> import *
,任何以单下划线开头的名称都不会被导入.除非模块/包的__all__
列表明确包含了这些名称.
class A(object):
def __init__(self):
self._a= '_a'
a = A()
a._a
>>>'_a'
2.__xxx
以双下划线命名,类中的私有变量(private),意思是只有类对象自己能访问,连子类对象也不能访问到这个数据.
class A(object):
def __init__(self):
self._a = '__a'
self.__a = '__a'
def __method_name(self):
print(__method_name)
a = A()
a.__a
>>>AttributeError: 'A' object has no attribute '__a'
双下划线的变量会被改下,__a
会被改写,变成_A__a
,如果非要访问也可以通过_A__a
的形式访问.
dir(A())
['_A__a',
'_A__method_name',
......
'_a']
3.__xxx__
是python的特殊方法名,当写一个类的时候经常会覆写__init__
方法,或者进行运算符重载的时候进行重写.
@property
装饰器,廖雪峰博客讲解
- 将类方法转换为只读属性
- 重新实现一个属性的setter和getter方法
下面这个代码就是实习了setter和getter重写,获取age属性,设定age属性又加上了约束.
class Student(object):
def __init__(self,age):
# 约定为保护变量
self._age = age
@property
# getter
def age(self):
return self._age
@age.setter
# setter
def age(self,value):
if not isinstance(value,int):
raise ValueError('value is must int')
if value < 0 or value >100:
raise ValueError('value is in 0- 100')
self._age = value
s = Student(6)
s.age = 99