面向对象之私有成员
私有成员
私有成员是仅在类内部才能访问的成员
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万元
这样虽然可以访问到私有成员,但还是应该尽量避免这样使用,因为私有成员设立的初衷就是供类内部访问的。
总结一下:私有成员是名字以__开头的成员,只能在类内部访问,不能在类外部和子类中访问