zoukankan      html  css  js  c++  java
  • 面向对象之私有成员

    私有成员

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

     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万元

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

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

  • 相关阅读:
    什么叫TLD、gTLD、nTLD、ccTLD、iTLD 以及几者之间的关系
    socket
    windows下codeblocks报错undefined reference to `WSAStartup@8'|
    Codeforces 467C George and Job | DP
    51Nod 1049最大子段和 | 模板
    51Nod 最大子矩阵和 | DP
    AtomicInteger
    sun.misc.unsafe
    CAS
    java中的四种引用
  • 原文地址:https://www.cnblogs.com/zzliu/p/10284830.html
Copyright © 2011-2022 走看看