双下划线开头的变量有两种:
- 双下划线开头并结尾的变量:
父类里双下划线开头并结尾的变量,会继承给子类,和普通变量差别不大 - 双下划线开头但没有双下划线结尾的变量:
双下划线开头但没有双下划线结尾的变量是父类完全私有变量,不能继承给子类,如果子类访问该变量,则会报错没有该属性。
示例代码:
class BaseModel:
__myvar1__ = "parent-var1"
__myvar2="parent-var2"
class MyModel(BaseModel):
pass
print('var1',MyModel.__myvar1__)#输出 var1 parent-var1
#以下会报错AttributeError: type object 'MyModel' has no attribute '__myvar2'
print('var2',MyModel.__myvar2)
不过也有特殊办法通过子类访问到父类的__myvar2,就是在该变量前加上父类名的前缀;如下代码所示
class BaseModel: # type: ignore
__wtf = "parent-wtf"
@classmethod
def get_wtf(cls):
print(cls) # 输出<class '__main__.MyModel'>
print(cls.__wtf) # 输出parent-wtf;本质上是访问了MyModel._BaseModel__wtf
return cls.__wtf
class MyModel(BaseModel):
pass
print(MyModel._BaseModel__wtf)#输出parent-wtf
MyModel.get_wtf()
父类中定义双下划线开头但没有双下划线结尾的变量时,需要谨慎,否则容易引发逻辑错误。