私有属性与私有方法

应用场景

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

定义方式

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

没使用私有属性前

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. 编程细节 —— 按值传递、按引用传递(final、const)

    System.out,out 是 System 类内定义的静态 final PrinterStream 变量: public final class System { ... public final ...

  2. 解决 django 中 mysql gone away 的问题

    最近在项目中,我使用 Django Command 模块写了一个脚本,处理从 MQ 发来的消息,并入库.在测试过程中,程序运行良好,但是在程序上线并运行一段时间后,出现了以下错误: Operation ...

  3. python-----tuple用法

    有一种有序列表叫元组:tuple.tuple和list非常类似,但是tuple一旦初始化就不能修改,比如同样是列出同学的名字: >>> classmates = ('Michael' ...

  4. HDU2138 素数判定

    HDU2138 给定N个32位大于等于2的正整数 输出其中素数的个数 用Miller Rabin 素数判定法 效率很高 数学证明比较复杂,略过, 会使用这个接口即可. #include<iost ...

  5. 洛谷P3690 LCT模板

    题目:https://www.luogu.org/problemnew/show/P3690 自己竟然从没有钻研过LCT上的连通性问题! 于是被最后一个点卡了,似乎因为 find 函数只能找出连通性而 ...

  6. ibwebrtc-audio-processing-devel

    http://ftp.ussg.iu.edu/cygwin/x86_64/release/webrtc-audio-processing/libwebrtc-audio-processing-deve ...

  7. sshfs把远程主机的文件系统映射到本地的目录中(转载)

    转自:http://www.fwolf.com/blog/post/329 windows之外的世界比想像中要大得多呢,几乎天天都在用ssh,却到今天才知道有sshfs这个好东西,前几天还在为Zend ...

  8. bzoj 1596: [Usaco2008 Jan]电话网络【贪心】

    dfs,如果一个点的儿子.本身.父亲都没有塔,就在父亲上建一个 原理不明-- #include<iostream> #include<cstdio> using namespa ...

  9. Oracle 助记

    title: Oracle 助记 Nothing is impossible! 基础操作 $ sqlplus name/pssword; # 登录数据库 $ create user username ...

  10. 对路径 obj 文件夹访问被拒绝

    TFS 刚下载的项目,出现该问题. 解决方案: 将文件夹属性“只读”,取消