私有属性与私有方法

应用场景

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

定义方式

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

没使用私有属性前

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. UVA - 12345 带修改的莫队

    题意显然:给出初始序列,单点修改,区间查询元素的种类. 由于时限过宽,暴力可过. 比较优秀的解法应该是莫队. 带修改的莫队题解可以看https://www.luogu.org/blog/user126 ...

  2. [bzoj3073]Journeys

    https://www.zybuluo.com/ysner/note/1295471 题面 \(Seter\)建造了一个很大的星球,他准备建造\(N\)个国家和无数双向道路.\(N\)个国家很快建造好 ...

  3. POJ1228 Grandpa's Estate 稳定凸包

    POJ1228 转自http://www.cnblogs.com/xdruid/archive/2012/06/20/2555536.html   这道题算是很好的一道凸包的题吧,做完后会加深对凸包的 ...

  4. 两个局域网(办公网-IDC)安全互通方案2:by GRE and linux server&深入理解GRE

    (0)gre的turnel的打通 1. 这个过程就是双方建立turnel的过程.           (1)局域网路由过程 1.主机A发送一个源为192.168.1.2,目的为10.1.1.2的包 ( ...

  5. 清北考前刷题day5早安

    /* C(n,k) */ #include<iostream> #include<cstdio> #include<cstring> #define ll long ...

  6. vue开发环境和生产环境里面解决跨域的几种方法

    什么是跨域   跨域指浏览器不允许当前页面的所在的源去请求另一个源的数据.源指协议,端口,域名.只要这个3个中有一个不同就是跨域. 这里列举一个经典的列子: #协议跨域 http://a.baidu. ...

  7. 【Nodejs】记一次图像识别的冒险

    笔者的团队最近接到了一个有关图像识别的需求,本来应该由后端团队提供能力,native提供容器,前端团队仅负责一些“外围的形式工作”,不过由于各种各样的原因,最后的结果变成了前端团队在原有工作基础上,承 ...

  8. 基于spring 3.0mvc 框架的文件上传实现

    Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块.使用 Spring 可插入的 MVC 架构,可以选择是使用内置的 Spring Web 框架还是 Struts 这样的 Web 框 ...

  9. Exceptions & Errors - 异常与错误

    来源于 Ry’s Objective-C Tutorial - RyPress 一个学习Objective-C基础知识的网站. 个人觉得很棒,所以决定抽时间把章节翻译一下. 本人的英语水平有限,有让大 ...

  10. Windows提高_2.3第三部分:内核区同步

    第三部分:内核区同步 等待函数(WaitForObject) 等待函数的形式 单个:WaitForSingleObject 多个:WaitForMultipleObjects 一个可以被等待的对象通常 ...