Python - 私有属性(双下线的变形)

__x会自动变形为_类名__x

正常情况

class A:

    def foo(self):
        print(‘from A‘)

    def test(self):
        self.foo()

class B(A):

    def foo(self):
        print(‘from B‘)

b = B()
b.test()
# from B

把foo定义成私有

class A:

    def __foo(self):    #双下线私有属性在定义时就变形为_A__fa
        print(‘from A‘)

    def test(self):
        self.__foo()    #调用变形后的私有属性对象,即_A__fa

class B(A):

    def __foo(self):
        print(‘from B‘)

b = B()
b.test()
# from A

原理:父类的__x私有属性在定义时已经变形为_父类__x,子类可以继承这个属性,但无法覆盖。所以test()里面的self.__foo的self已经绑定了父类,子类的__foo()无法覆盖。

class A:

    def __foo(self):    #双下线私有属性在定义时就变形为_A__fa
        print(‘from A‘)

    def test(self):
        self.__foo()    #调用变形后的私有属性对象,即_A__fa

class B(A):

    def __foo(self):
        print(‘from B‘)

b = B()
b._A__foo()
# from A

Python的私有属性的缺点

这种变形并没有真正限制从外部直接访问属性

class A:

    def __foo(self):
        print(‘from A‘)

    def test(self):
        self.__foo()

a = A()
a._A__foo()

原文地址:https://www.cnblogs.com/allen2333/p/9297317.html

时间: 2024-11-05 18:33:44

Python - 私有属性(双下线的变形)的相关文章

Python私有属性set 和get方法

class Person(object): #self不是关键字,换成其他的标识符也是可以的,但是一般不要改 def run(self): print("run") def eat(self,food): print("eat" + food) def say(self): print("hello! my name is %s,i am %d years old" %(self.name,self.age)) def __init__(self

Python私有属性

1 访问类的私有属性首先我们定义一个包含私有属性的类,尝试使用实例对象访问它 [Python] 纯文本查看 复制代码 ? 1 2 3 4 5 6 7 8 class People(object):     def __init__(self):         self.__age = 20 people = People() print(people.__age) 结果如下: [Python] 纯文本查看 复制代码 ? 1 2 3 4 Traceback (most recent call l

Python私有属性和私有方法

私有属性和私有方法 01. 应用场景及定义方式 应用场景 在实际开发中,对象 的 某些属性或方法 可能只希望 在对象的内部被使用,而 不希望在外部被访问到 私有属性 就是 对象 不希望公开的 属性 私有方法 就是 对象 不希望公开的 方法 定义方式 在 定义属性或方法时,在 属性名或者方法名前 增加 两个下划线,定义的就是 私有 属性或方法 class Women: def __init__(self, name): self.name = name # 不要问女生的年龄 self.__age

Python私有属性set和get方法2

class Person(object): count = 0 #类属性 def __init__(self,name,age):#实例属性 # self.__name = name#name是私有属性:私有属性接收是set/get方法; # self.__name 也可以用 self.setName(name) 这样的好处是在创建实例的时候,不用再重新去给赋值(调用set方法),初始化就可以赋值 self.setName(name) self.age = age def run(self):

Python私有属性@property方法

# 把得到的属性值的方法上@property# 在设置属性值的方法上@属性名.setter# 两个方法的名字一致,都是属性名#先写@property再写@属性名.setterclass Person(object): def __init__(self,name,age):#在定义对象属性的时候,私有属性不加__ self.name = name self.age = age @property#相当于getName()方法 def name(self): return self.__name#

3.5私有属性和私有方法

私有属性和私有方法 01. 应用场景及定义方式 应用场景 在实际开发中,对象 的 某些属性或方法 可能只希望 在对象的内部被使用,而 不希望在外部被访问到 私有属性 就是 对象 不希望公开的 属性 私有方法 就是 对象 不希望公开的 方法 定义方式 在 定义属性或方法时,在 属性名或者方法名前 增加 两个下划线,定义的就是 私有 属性或方法 ```python class Women: def __init__(self, name): self.name = name # 不要问女生的年龄 s

Python 之私有属性

概要 在基类的定义中,如果有些属性或者方法,我们希望隐藏它,从而不被子类继承,或者使其不被实例直接访问到,这时候可以用到私有属性的命名方法.尽管类的所有属性和方法在某种意义上说都是"暴露的",但是私有属性的存在即表达了我们的态度. ? 私有属性命名规则 在类中所有以双下划线开头的名称都会自动变形,比如一个私有属性名为 __print,会自动变形为 _Classname__print,这样就有效避免了在子类中使用的私有名称不会与基类中使用的相同私有名称发生冲突.示例代码如下: # -*-

私有属性,私有方法,类变量,实例变量,单下划线,双下划线

1.私有属性__age,不能通过实例对象直接调用,而是通过一个方法来调用 class Dog: def __init__(self, new_age): self.__age = new_age def get_age(self): return self.__age wang_cai = Dog(1) result = wang_cai.get_age() print(result) 2.私有方法,通过一个共有方法来调用 class Dog(object):   def __init__(se

伪私有属性 | 伪私有方法 | Python

1.私有属性 # 在属性前加上双下划线 # 为了保护属性安全 # 私有属性无法直接通过对象调用,需要添加一个调用方法来调用: class People(object): def __init__(self): self.__name = 'Mic' def get_private_attr(self, new_name): self.__name = new_name print(self.__name) # 创建对象 p = People() # 获取私有属性 p.get_private_at