数据封装和私有属性
像java
中一般用private
和protected
来实现类中的私有方法和受保护的方法。
我已经在chapter04
文件夹内写好了一个class_method.py
文件,文件中定义了一个Date
类。具体的Date
类参见这篇博客
然后我们导入Date
类
from chapter04.class_method import Date
class User:
def __init__(self):
self.brithday = birthday
def get_age(self):
#返回年龄
return 2018 - self.birthday.year
if __name__ = "__main__":
user = User(Date(1990,2,1))
print(user.get_age()) # 28 2018-1990
print(user.birthday) # 1990/2/1 可以获取到用户的birthday
User
类中初始化传入的参数是一个出生日期,但是如果我们希望在获取某人年龄的时候能够隐藏对象的birthday
,即不能直接访问birthday
,将其隐藏。
python
使用双下滑线来进行私有属性的封装。
class User:
def __init__(self):
self.__brithday = birthday
def get_age(self):
#返回年龄
return 2018 - self.__birthday.year
if __name__ = "__main__":
user = User(Date(1990,2,1))
print(user.get_age()) # 28
print(user.__birthday) # ‘User’ object has no attribute ‘__birthday’
私有属性是无法通过实例.私有属性
来获取,也无法通过子类来获取,但是在类中的公共方法中还是可以使用,即print(user.get_age())
结果为28。
函数前加双下划线也是可以将函数隐藏的,但从理论上来说,双下划线并没有从语言层面上来解决了私有属性的绝对私有性,只是加了一下小技巧。将__birthday
变成_User__birthday
这样一种结构化的方法。
_User__birthday
其中User
代表当前类,如果是别的类,就换成别的类名,这也可以缓解不同类之间相同属性名的冲突。
print(user._User__birthday) # 1990/2/1
#这样就能访问到了