29. Python中类的私有属性和受保护属性

《Python编程的术与道:Python语言入门》视频课程
《Python编程的术与道:Python语言入门》视频课程链接:https://edu.csdn.net/course/detail/27845

私有属性和受保护属性

C ++和Java之类的经典面向对象语言通过公有(public)、私有(private)和受保护(protected)的关键字来控制对类资源的访问。类的私有成员拒绝从类外部环境访问。它们只能在类的内部处理。

可从类外部访问公有成员(通常是在类中声明的方法)。调用公有方法需要相同类的对象。私有实例变量和公共方法的这种安排确保了数据封装的原理。

类的受保护成员可以从该类内部访问,也可以用于其子类。不允许其他环境访问它。这样可以使子类继承父类的特定资源。

Python没有有效限制访问任何实例变量或方法的机制。 Python规定了在变量/方法名称前加单下划线双下划线的约定,以模拟受保护和私有访问说明符的行为。

默认情况下,Python类中的所有成员都是公有的。可以从类环境之外访问任何成员。

Example: Public Attributes

class Employee:
    def __init__(self, name, sal):
        self.name=name
        self.salary=sal

可以访问员工类的属性,也可以修改其值,如下所示。

e1=Employee("Kiran",10000)
e1.salary
10000
e1.salary=20000
e1.salary
20000

Python的实例变量受保护的约定是在其上添加前缀_(单个下划线)。 这将约定防止对其进行访问, 除非访问来自子类。

Example: Protected Attributes

class Employee:
    def __init__(self, name, sal):
        self._name=name  # protected attribute 
        self._salary=sal # protected attribute

实际上,这不会阻止实例变量访问或修改实例。 仍然可以执行以下操作:

e1=Employee("Swati", 10000)
e1._salary
10000
e1._salary=20000
e1._salary
20000

因此,负责的程序员应避免从其类的外部访问和修改以_开头的实例变量。

同样,在变量前加上双下划线__使其变为私有。 强烈建议不要在类外碰它。 尝试这样做会导致AttributeError:

Example: Private Attributes

class Employee:
    def __init__(self, name, sal):
        self.__name=name  # private attribute 
        self.__salary=sal # private attribute
e1=Employee("Bill",10000)
e1.__salary 
---------------------------------------------------------------------------

AttributeError                            Traceback (most recent call last)

<ipython-input-9-d5a2eb37a52c> in <module>
      1 e1=Employee("Bill",10000)
----> 2 e1.__salary


AttributeError: 'Employee' object has no attribute '__salary'

Python执行私有变量的改名处理(name mangling)。 每个具有双下划线的成员将更改为_object._class__variable。 如果需要,仍然可以从类外部访问它,但是应该避免这种做法。

e1=Employee("Bill",10000)
e1._Employee__salary
10000
e1._Employee__salary=20000
e1._Employee__salary
20000
  • 6
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Python中,没有严格意义上的私有成员和共有成员的概念。但是,可以通过以下方式模拟: 1. 以双下划线开头的变量或方法名表示私有成员,如`__private_var`或`__private_method`。 2. 以单下划线开头的变量或方法名表示保护的成员,即只能在当前类或子类中访问,如`_protected_var`或`_protected_method`。 3. 没有下划线开头的变量或方法名表示公有成员,即可以在任何地方访问,如`public_var`或`public_method`。 下面是一个示例代码: ```python class MyClass: def __init__(self): self.public_var = "public" # 公有成员 self._protected_var = "protected" # 保护的成员 self.__private_var = "private" # 私有成员 def public_method(self): print("This is a public method.") def _protected_method(self): print("This is a protected method.") def __private_method(self): print("This is a private method.") def access_private(self): print(self.__private_var) # 可以在类内部访问私有成员 self.__private_method() # 可以在类内部调用私有方法 obj = MyClass() print(obj.public_var) # 可以访问公有成员 print(obj._protected_var) # 可以访问保护的成员 obj.public_method() # 可以调用公有方法 obj._protected_method() # 可以调用保护的方法 # obj.__private_var # 不能直接访问私有成员,会报错 # obj.__private_method() # 不能直接调用私有方法,会报错 obj.access_private() # 可以通过类内部的方法访问私有成员和方法 ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bai666ai

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值