面向对象之私有成员

私有成员

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

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

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

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

原文地址:https://www.cnblogs.com/zzliu/p/10284830.html

时间: 2024-10-15 05:08:37

面向对象之私有成员的相关文章

面向对象的JavaScript(3):私有成员和公开成员

在小项目中对于JavaScript使用,只要写几个function就行了.但在大型项目中,尤其是在开发追求 良好的用户体验的网站中,如SNS,就会 用到大量的JavaScrpt,有时JavaScript的工作量胜过了C#,这时写一堆function,就会显得很乱,杂乱无章,甚至会出现命名冲突,管理和维 护起来都很麻烦.对于这种情况我们就需要使用面向对象的思想来开发JavaScript.那我们就这样作罢: 这节来说下JavaScript的私有成员和公开成员,虽然JavaScript没有privat

Python 学习笔记 - 面向对象(类成员)

上一篇学习了Python面向对象的3大特性,封装,继承和多态,这一篇继续学习类成员,包括字段,方法,属性以及他们的修饰符. 1.字段 字段分为静态字段和普通字段.静态字段属于类,而普通字段属于对象,因此静态字段在内存中只保存一份,而普通字段在每个对象中都保存了一份.定义的时候静态字段定义在类的范围里面,而普通字段定义在方法里面. 例如: >>> class Foo:     # 字段(静态字段)     CC = 123     def __init__(self):         #

JAVA之旅(四)——面向对象思想,成员/局部变量,匿名对象,封装 , private,构造方法,构造代码块

JAVA之旅(四)--面向对象思想,成员/局部变量,匿名对象,封装 , private,构造方法,构造代码块 加油吧,节奏得快点了 1.概述 上篇幅也是讲了这点,这篇幅就着重的讲一下思想和案例 就拿买电脑来说吧,首先,你不懂电脑,你去电脑城买电脑,和大象装冰箱里一样,是什么步骤?咨询 砍价 ,谈妥了就那电脑走人,对吧,这就是面向过程的思想,而面向对象是:你有一个哥们,他懂电脑,什么都会,你只要带他去,就行,你这个哥们就是对象,在JAVA中,我们就是操作一个对象去完成各种各样的操作的,这就是面向对

文成小盆友python-num8 面向对象中的成员,成员修饰符,特殊成员,异常处理,设计模式之单例模式

本节主要内容: 1.面向对象中的成员 2.成员修饰符 3.特殊成员 4.异常处理 5.设计模式之单例模式 一.面向对象中的成员(类的成员) 类的成员总共可以分为3大类,每类中有不同的分支. 1.总述,基本分类 如下图所示: 类成员包括字段,方法,和属性 2.字段 如上图字段分为普通字段和静态字段,两者的使用有区别,但是最大的区别在于两者在内存中的保存位置有区别. 普通字段属于对象而静态字段属于类,在使用过程中谁的字段就由谁来调用. 静态字段和普通字段的定义如下: 在调用时分各自调用 #####类

python 面向对象和类成员和异常处理

python 面向对象 你把自己想象成一个上帝,你要创造一个星球,首先你要把它揉成一个个球,两个直径就能创造一个球 class star: '''名字(name),赤道直径(equatorial diameter),极直径(polar diameter)''' def __init__(self,name,eqDiameter,poDiameter): self.name=name self.eqDiameter=eqDiameter #赤道直径 self.poDiameter=poDiamet

通过指针访问C++对象的私有成员

C++对象的私有成员是禁止类外的访问的.但是我们仍然可以通过指针访问C++对象的私有成员. #include <iostream> using namespace std; class A { public: A(int i = 0) :m_i(i) {} void print() { cout << "m_i" << this->m_i << endl; } private: int m_i; }; int main(int ar

使用反射机制调用属性和私有成员与代理模式的介绍

使用反射机制调用属性: 通过反射机制可以获得类的属性,获得到的属性同样的可以进行赋值.得值操作,调用getField方法并传递属性的名称可以获得[学Java,到凯哥学堂kaige123.com]指定的属性,调用getFields方法则可以获得全部属性,但是这种方式不能获得私有属性: 代码示例: Student类示例: 运行结果: 从运行结果可以看出只拿出了公开的属性,私有的属性拿不到. 使用反射机制调用私有成员: 1.调用私有属性 在反射机制里调用私有属性需要通过getDeclaredField

通过反射,如何操作私有成员变量(取/赋值),如何调用私有方法?

Java的反射工具很强大,有句著名的话:No reflection ,no frameworks. 工作中直到涉及到UT,才体会到它的重要性,现归纳整理一个小例子: 反射工具类: 1 import java.lang.reflect.Field; 2 import java.lang.reflect.InvocationTargetException; 3 import java.lang.reflect.Method; 4 5 public class ReflectionUtil { 6 7

访问私有成员的方法-------C# 转载

1.得到私有字段的值: public static T GetPrivateField<T>(this object instance, string fieldname) { BindingFlags flag = BindingFlags.Instance | BindingFlags.NonPublic; Type type = instance.GetType(); FieldInfo field = type.GetField(fieldname, flag); return (T)