私有属性与私有方法

应用场景

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

定义方式

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

没使用私有属性前

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. brew安装PHP7 swoole

    环境: 系统:mac os High Sierra 10.13.3 php版本:7.0.27_19 1.安装homebrew brew 又叫Homebrew,是Mac OSX上的软件包管理工具,能在M ...

  2. NOI.AC #31 MST —— Kruskal+点集DP

    题目:http://noi.ac/problem/31 好题啊! 题意很明白,对于有关最小生成树(MST)的题,一般是要模拟 Kruskal 过程了: 模拟 Kruskal,也就是把给出的 n-1 条 ...

  3. POJ1912 A highway and the seven dwarfs (判断凸包与直线相交 logn)

    POJ1912 给定n个点 和若干条直线,判断对于一条直线,是否存在两个点在直线的两侧. 显然原命题等价于 凸包与直线是否相交. O(n)的算法是显而易见的 但是直线数量太多 就会复杂到O(n^2)由 ...

  4. 如何给自己的博客上添加个flash宠物插件

    最近在一些博主的博客上看到一些小宠物的挂件,很有趣,访客到了网站后可以耍耍小宠物,增加网站的趣味性,在功能强大的博客系统上看到有这样的小宠物挂件还是蛮有趣的. 多次差找资料后,终于在http://ww ...

  5. bzoj 1638: [Usaco2007 Mar]Cow Traffic 奶牛交通【记忆化搜索】

    震惊!记忆化搜索忘记返回map值调了半小时! 边(u,v)的经过次数是:能到u的牛数*v到n的方案数.正反两次连边,dfs两次即可 #include<iostream> #include& ...

  6. 17年day5

    /* 嗯,一切都快要结束了. 觉得不必要写太多,从day5开始就挺好吧. 记得去年这时候看到峰峰博客里的倒计时,心里还毫无波动,只是走的时候挺伤心. 现在轮到了我们. 峰峰我想你. 衷心祝zjk和my ...

  7. 【Linux】小米路由开启SSH访问权限

    一.验证小米路由ROM是否为开发版 1.  登录小米路由Web管理页面,检查ROM版本是否为开发版(若为开发版直接跳至第二步,若为稳定版继续本步骤). 2. 进入小米路由器官网(http://www1 ...

  8. ACM_01背包(恰好装满)

    背包2 Time Limit: 2000/1000ms (Java/Others) Problem Description: 有n个重量和价值分别为Wi,Vi的物品,现从这些物品中挑选出总量刚好为 W ...

  9. 使用Oracle SQL Developer迁移MySQL至Oracle数据库

    Oracle SQL Developer是Oracle官方出品的数据库管理工具.本文使用Oracle SQL Developer执行从MySQL迁移至Oracle数据库的操作. 2017年3月6日 操 ...

  10. 全面学习ORACLE Scheduler特性(9)创建Chains

    五.使用Chains 今天要来认识一位新同学:CHAIN(注意不要敲成CHINA).CHAIN可以被视做一组Programs的复合,举个简单的例子:运行PROGRAM:A以及PROGRAM:B,如果成 ...