码迷,mamicode.com
首页 > 编程语言 > 详细

Python全栈之路----面向对象开发----封装

时间:2019-05-23 00:14:23      阅读:143      评论:0      收藏:0      [点我收藏+]

标签:Python全栈   划线   init   外部   color   from   直接   通过   方法   

封装之如何隐藏属性

在python中用双下划线开头的方式设置属性将属性隐藏起来(设置成私有的),以双下划线开头且双下划线结尾的是python的内置方法。

# 其实这仅仅这是一种变形操作
# 类中所有双下划线开头的名称如__x都会自动变形成:_类名__x的形式:

class A:
    __N=0 # 类的数据属性就应该是共享的,但是语法上是可以把类的数据属性设置成私有的,如__N,会变形为_A__N
    def __init__(self):
        self.__X=10  # 变形为self._A__X
    def __foo(self):  # 变形为_A__foo
        print(from A)
    def bar(self):
        self.__foo()  # 只有在类内部才可以通过__foo的形式访问到.

# A._A__N是可以访问到的,即这种操作并不是严格意义上的限制外部访问,仅仅只是一种语法意义上的变形

这种变形的特点:

  1. 在类外部无法直接 A.__N
  2. 在类内部是可以直接使用:A.__N
  3. 子类无法覆盖父类 __ 开头的属性
  4. 变形只在定义类里面发生,在类外面定义是不会发生变形的
# 带 __ 的属性名,父类与子类中属性名字不同,所以不存在覆盖一说
class Foo:
    def __func(self):  # _Foo__func
        print(from foo)

class Bar(Foo):
    def __func(self):  # _Bar__func
        print(from bar)

如果子类里面有和父类的同名属性,想使用父类里的属性,不想被覆盖,把父类里的同名属性前加上 __ , 在另一个属性内进行调用。

class A:
    def __foo(self):  # _A__foo
        print(A.foo)
    
    def bar(self):
        print(A.bar)
        self.__foo()  # self._A__foo
        
class B(A):
    def foo(self):  # _B_foo
        print(B.foo)

b = B()
b.bar()

 

Python全栈之路----面向对象开发----封装

标签:Python全栈   划线   init   外部   color   from   直接   通过   方法   

原文地址:https://www.cnblogs.com/Moxiaoyu666/p/10909218.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!