在java或者c++里面,我们都有private,protected等来修饰类,从而达到数据封装和私有属性的目的,但是在Python里面,这些都是没有的,那么它是如何达到相同目的的呢?我们继续看段代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from .class_method import Date


class User:
def __init__(self, birthday):
self.birthday = birthday

def get_age(self):
return 2018-self.birthday.year


user = User(Date(1990, 9, 12))
print(user.get_age()) # 通过调用这个get_age方法来获取对象的年龄
print(user.birthday) # 通过调用这个birthday属性来获取对象的出生信息

# 输出结果:
28
1990/9/12

现在我们不希望直接获取到自己的出生信息,需要对其进行隐藏,我们可以使用__birthday(前面有2个下划线)就能实现这个功能:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class User:
def __init__(self, birthday):
self.__birthday = birthday

def get_age(self):
return 2018-self.__birthday.year


user = User(Date(1990, 9, 12))
print(user.get_age())
print(user.__birthday)

# 输出结果:
AttributeError: 'User' object has no attribute '__birthday'

但是我们却依然可以通过它提供的get_age方法进行获取信息:

1
2
3
4
5
6
7
 def get_age(self):
return 2018-self.__birthday.year

print(user.get_age())

# 输出结果:
28

也就是说只能通过类提供的公共方法来进行访问,而不能通过对象的属性这种方式来进行访问了。实际上Python只是对这个__birthday进行了变形,变成了_Classname__attr这种方式,也就是_User__birthday,我们尝试着打印输出一下:

1
2
3
4
print(user._User__birthday)

# 输出结果:
1990/9/12

也就是说从语言层面上来说并没有完全解决我们这个属性的私有化,只是加了一些小的技巧,将变量进行了变形,所以并不存在的完全的安全性,java也是一样的,只是安全性的破解方法简单容易而已。Python里面的这种技巧也可以很好的解决多继承问题中变量的名字冲突的问题。

[ - ]参考文章:
Python笔记8——数据封装和访问限制