Protected 成员(在 C++ 和 JAVA 中)是不能在类外部访问但可以从类及其子类内部访问的那些成员。要在 Python 中完成此操作,只需按照约定在成员名称前加上一个下划线“_”即可。
尽管 Protected 变量可以在类外以及派生类中访问(在派生类中也可以修改),但习惯上(约定不是规则)不访问受保护的类主体。
注意: __init__
方法是一个构造函数,并在类的对象被实例化后立即运行。
演示 Protected 成员的 Python 程序
class Base:
def init(self):
Protected 成员
self._a = 2
创建派生类
class Derived(Base):
def init(self):
调用基类的构造函数
Base.init(self)
print("调用基类的 Protected 成员: ",
self._a)
Modify the protected variable:
self._a = 3
print("调用类外修改的 Protected 成员: ",
self._a)
obj1 = Derived()
obj2 = Base()
调用 Protected 成员可以访问,但由于约定不应该这样做
print("访问 obj1 的 Protected 成员: ", obj1._a)
在外部访问受保护的变量
print("访问 obj2 的 Protected 成员: ", obj2._a)
输出:
调用基类的 Protected 成员:2
调用类外修改的 Protected 成员:3
访问 obj1 的 Protected 成员:3
访问 obj2 的 Protected 成员:2
Private 成员
Private 成员类似于 Protected 成员,不同之处在于声明为私有的类成员既不能在类外访问,也不能被任何基类访问。在 Python 中,不存在只能在类内部访问的私有实例变量。
但是,要定义 Private 成员,请在成员名称前加上双下划线“__”。
注意:可以通过 python name mangling 在类外部访问 Python 的 Private 成员和 Protected 成员。
Python 中的魔术方法
魔术方法确保了一致的数据模型,该模型保留了内置类的继承特性,同时提供了自定义的类行为。这些方法可以丰富类设计,增强语言的可读性。
魔术方法语法
两边用两个下划线包裹的方法称为魔术方法。魔术方法的背后是重载 Python 的内置方法及其运算符。在这里,_syntax 防止程序员为自定义方法定义相同的名称。每种魔术方法都有其用途。让我们考虑一个检查等价的例子。
例子:
class EquivalenceClass(object):
def eq