私有属性与私有方法

应用场景

  • 在实际开发中,对象的某些属性或者方法 可能只希望在对象的内部被使用,而不希望在外部被访问到;
  • 私有属性 就是对象不希望公开的属性;
  • 私有方法 就是对象不希望公开的方法;

定义方式

在定义属性或者方法时,在属性名或者方法名前面增加两个下划线,定义的就是私有属性或方法;

没使用私有属性前

class Women:
def __init__(self, name, age):
self.name = name
self.age = age def secret(self):
print("%s 的年龄是 %d" % (self.name, self.age)) xiaohong = Women("小红", 18) print(xiaohong.age) # 18
xiaohong.secret() # 小红 的年龄是 18

使用私有属性后

class Women:
def __init__(self, name, age):
self.name = name
self.__age = age def secret(self):
print("%s 的年龄是 %d" % (self.name, self.__age)) xiaohong = Women("小红", 18)
# 不能在外部直接通过对象调用私有属性
# print(xiaohong.age) # 报错 AttributeError: 'Women' object has no attribute 'age'
# 但还是能通过内部方法调用对象的私有属性
xiaohong.secret() # 小红 的年龄是 18 公有方法还是能够调用私有属性

使用私有方法后

class Women:
def __init__(self, name, age):
self.name = name
self.__age = age def __secret(self):
print("%s 的年龄是 %d" % (self.name, self.__age)) xiaohong = Women("小红", 18)
# 当设置私有方法后,外部就不能调用私有方法了
# xiaohong.__secret() # 报错 AttributeError: 'Women' object has no attribute '__secret'

伪私有属性和方法

在python中,并没有真正意义上的私有,只有伪私有;

  • python在给私有属性和私有方法命名时,实际是对名称做了一些特殊处理,是的外界无法访问到;
  • 处理方式:在名称前加上 _类名,即 _类名__名称

破解私有属性和私有方法

class Women:
def __init__(self, name, age):
self.name = name
self.__age = age def __secret(self):
print("%s 的年龄是 %d" % (self.name, self.__age)) xiaohong = Women("小红", 18)
# 当设置私有方法后,外部就不能直接调用私有方法了
# xiaohong.__secret() # 报错 AttributeError: 'Women' object has no attribute '__secret' # 破解私有属性和私有方法,但不建议使用
print(xiaohong._Women__age) # 18
xiaohong._Women__secret() # 小红 的年龄是 18

但注意,在日常开发中,不要使用这种方式访问对象的私有属性或者私有方法!!我们只需要用提供的公共方法来简介调用私有方法或属性即可。

父类的私有属性和方法

  1. 子类对象不能在自己的方法内部,直接访问父类的私有属性和私有方法;
  2. 子类对象可以通过父类的共有方法,间接访问到私有属性和私有方法。

私有属性,方法,是对象的隐私,不对外公开,外界以及子类,都不能直接访问;

私有属性,方法通常用来做一些内部的事情;

子类对象,可以调用父类的公有方法和公有属性;

而如果父类中的公有方法 有调用父类的私有属性的话,那么我们也可以通过调用父类的公有方法来间接调用父类的私有属性和方法。

class Women:
def __init__(self, name, age):
self.name = name
self.__age = age def __secret(self):
print("私有:%s 的年龄是 %d" % (self.name, self.__age)) def public(self):
print("公有:%s 的年龄是 %d" % (self.name, self.__age))
self.__secret() class Girl(Women):
def test(self):
print("你的姓名是 %s" % self.name)
# print("你的年龄是 % d" % self.__age) # 不能在子类中直接调用父类的私有属性
# self.__secret() # 不能在子类中直接调用父类的私有方法 # 可以通过调用父类的公有方法来简介调用父类的私有属性和方法
self.public() # 运行结果:(公有:xiaohong 的年龄是 18 私有:xiaohong 的年龄是 18)
print("...") xiaohong = Girl("xiaohong", 18)
# 子类的对象不能在外部直接调用父类/祖父类的私有属性和方法
# print(xiaohong.__age)
# print(xiaohong.__secret)
xiaohong.test()

Python面向对象之私有属性和方法的更多相关文章

  1. Python面向对象之私有属性和私有方法

    01. 应用场景及定义方式 应用场景 在实际开发中,对象 的 某些属性或方法 可能只希望 在对象的内部被使用,而 不希望在外部被访问到 私有属性 就是 对象 不希望公开的 属性 私有方法 就是 对象  ...

  2. python 类的私有属性和方法 (转载)

    转载:http://www.runoob.com/python/python-object.html 类属性与方法 类的私有属性 __private_attrs:两个下划线开头,声明该属性为私有,不能 ...

  3. Python面向对象05 /私有成员、类方法、静态方法、属性、isinstance/issubclass

    Python面向对象05 /私有成员.类方法.静态方法.属性.isinstance/issubclass 目录 Python面向对象05 /私有成员.类方法.静态方法.属性.isinstance/is ...

  4. Python中的私有属性私有方法、类属性类方法以及单例设计模式

    私有属性是对象不希望公开的属性,私有方法是对象不希望公开的方法.在定义私有属性和私有方法时,在属性或者方法前,加上__(两个下划线) 公有方法可以通过对象名直接调用,私有方法不能通过对象名直接调用,只 ...

  5. Python 类的私有属性与私有方法

    1.隐藏的使用场景 在Python类中,有些属性和方法只希望在对象的内部被使用,而不希望在外部被访问到, 2.定义方式, 在属性名或方法名前增加两个下划线,定义的就是私有属性或方法 #其实这仅仅这是一 ...

  6. Python - 面向对象编程 - 公共属性、保护属性、私有属性

    公共属性 在 Python 的类里面,所有属性和方法默认都是公共的 class PoloBlog: # 公共属性 sum = 0 # 构造方法 def __init__(self, name): se ...

  7. Python的伪私有属性

    什么是伪私有属性? 在Python中,没有类似 private 之类的关键字来声明私有方法或属性. Python中要声明私有属性,需要在属性前加上双下划线(但是结尾处不能有双下划线),如:self._ ...

  8. Python面向对象之常用的特殊方法(5)

    Python面向对象里面有很多特殊方法,例如__init__(构造方法),__del__(析构方法),这些方法对于面向对象编程非常重要,下面列出一些常用的特殊方法 (1)__call__ class ...

  9. python 给对象绑定属性和方法和__slots__的使用

    # 以c语言为主是静态语言,运行之前先编译,在运行的过程中不允许编辑代码# 在运行的过程中,可以改变,可以添加属性,就是属于动态语言(python) # python动态的添加属性以及方法class ...

随机推荐

  1. Flask的flask-sqlalchemy

    flask-sqlalchemy是Flask和SQLAlchemy的管理者 - db = SQLAlchemy() - 包含配置 - 包含ORM基类 - 包含create_all - engine - ...

  2. bzoj3566

    3566: [SHOI2014]概率充电器 Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 982  Solved: 422[Submit][Statu ...

  3. 25.EXTJS 主页面的jsp

    1. /** * @author sux * @time 2011-1-11 * @desc main page */ var mainPage = Ext.extend(Ext.Viewport,{ ...

  4. MySQL 备份和恢复数据

    备份指定数据库的全部表或指定表 mysqldump -u user -h localhost -p [password] db_name[ tbl_name[,tbl_name.......]]> ...

  5. Geometry Shader 实现 Wireframe 绘制边线的Shader

    最终效果: 参考了一个免费插件 https://assetstore.unity.com/packages/vfx/shaders/directx-11/ucla-wireframe-shader-2 ...

  6. 洛谷 P1865 A % B Problem(求区间质数个数)

    题目背景 题目名称是吸引你点进来的 实际上该题还是很水的 题目描述 区间质数个数 输入输出格式 输入格式: 一行两个整数 询问次数n,范围m 接下来n行,每行两个整数 l,r 表示区间 输出格式: 对 ...

  7. Java多线程(八) synchronized 抛出异常锁自动解除

    当一个线程执行的代码出现异常时,其所持有的锁会自动释放 public class MyObject { private int i = 1; synchronized public void meth ...

  8. Roslyn导致发布网站时报错:编译失败

    最近新升级了Visual Studio 2017,创建的Web项目Bin目录中多了一个叫roslyn的文件夹,该文件夹导致网站在某些服务器上发布出错 从网上搜索了一下,Roslyn是新出的动态编译工具 ...

  9. UIPickerView 多级联动

    UIPickerView的多级联动问题有些地方需要注意,其实多级联动并不难...楼主因为项目需要又没法使用网上的第三方,所以最近写了一个省市区多级联动,还是手写代码好!! 为了演示效果,我会多定义几个 ...

  10. (2)麻省理工:计算机科学和 Python 编程导论

    语义描述了我们如何从那些表达式中推导出相关的含义,从而解决我们想解决的问题. 语法描述了如何将合法表达式组合在一起. 我们要选择什么样的编程语言? 1.     不管我们选什么,都有如下过程: 输入信 ...