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

Posted moxiaoyu666

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python全栈之路----面向对象开发----封装相关的知识,希望对你有一定的参考价值。

封装之如何隐藏属性

在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全栈之路----面向对象开发----元类介绍

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

8python全栈之路-初识面向对象

Python全栈之路系列----之-----面向对象

10python全栈之路-面向对象进阶

1Python全栈之路系列之面向基础