面向对象之私有成员

私有成员

私有成员是仅在类内部才能访问的成员

 1 class Company:
 2     country = "China"        # 公有静态属性
 3     __employee_num = 1000     # 私有静态属性
 4 
 5     def __init__(self, name, start_time, registered_capital):
 6         self.name = name
 7         self.start_time = start_time
 8         self.__registered_capital = registered_capital     # 私有对象属性
 9 
10     def get_employee_num(self):        # 通过了方法间接访问私有静态属性
11         print(self.__employee_num)
12 
13     def get_registered_capital(self):
14         print(self.__registered_capital)
15 
16     def get_name(self):
17         print(self.name)
18 
19     def __show_detail(self):
20         print("%s公司的注册资本是%s万元" % (self.name, self.__registered_capital))
21 
22     def show_detail(self):
23         self.__show_detail()
24 
25 
26 xiaomi = Company("小米", "2011年", 1000)
27 
28 # 访问私有静态属性
29 # print(xiaomi.country)    # China
30 # print(xiaomi.__employee_num)   # 报错
31 # print(Company.__employee_num)   # 报错
32 # xiaomi.get_employee_num()    # 通过实例方法间接访问
33 
34 # 访问私有方法
35 # xiaomi.__show_detail()   # 报错
36 # xiaomi.show_detail()   # 间接访问

可以看到,在类外部不能访问私有成员,那么在子类中可以访问吗?来看代码

 1 class StockCompany(Company):
 2     pass
 3 
 4 
 5 dami = StockCompany("大米", "2018", 500)
 6 
 7 # 访问私有静态属性
 8 # print(dami.__employee_num)    # 报错
 9 dami.get_employee_num()   # 1000
10 
11 # 访问私有方法
12 # dami.__show_detail()    # 报错
13 dami.show_detail()    # 大米公司的注册资本是500万元

准确来说,私有成员并不是绝对不能被访问到,在某些情况下需要访问到私有属性,因此Python提供了一个访问私有属性的方法,就是_类名__属性名的方式

print(Company.__dict__)

打印Company.__dict__可以发现类里面的私有成员名字前面加了_Company,因此我们可以通过 类名._类名__属性名 的方式访问私有成员

# print(Company.__dict__)
# print(Company._Company__employee_num)    # 1000
# print(xiaomi._Company__employee_num)     # 1000
# xiaomi._Company__show_detail()       # 小米公司的注册资本是1000万元

这样虽然可以访问到私有成员,但还是应该尽量避免这样使用,因为私有成员设立的初衷就是供类内部访问的。

总结一下:私有成员是名字以__开头的成员,只能在类内部访问,不能在类外部和子类中访问

猜你喜欢

转载自www.cnblogs.com/zzliu/p/10284830.html