Python中的私有类变量?
我希望能够在不继承类变量的情况下扩展类 在这种情况下:Python中的私有类变量?,python,class,Python,Class,我希望能够在不继承类变量的情况下扩展类 在这种情况下: A类: 别名=['a','ay'] B(A)类: 通过 打印(B.别名) 我宁愿得到一个错误,B没有定义别名变量,也不希望B意外调用ay 可以想象一种解决方案,其中别名成为实例化对象(self.aliases)的一个成员,并在\uuuu init\uuuu中设置,但我确实希望能够使用cls对象而不是类的实例来访问别名 有什么建议吗?这是一项有点古怪的工作,但你可以这样做: class K: def __init__(self):
A类:
别名=['a','ay']
B(A)类:
通过
打印(B.别名)
我宁愿得到一个错误,B没有定义别名
变量,也不希望B
意外调用ay
可以想象一种解决方案,其中别名成为实例化对象(self.aliases
)的一个成员,并在\uuuu init\uuuu
中设置,但我确实希望能够使用cls
对象而不是类的实例来访问别名
有什么建议吗?这是一项有点古怪的工作,但你可以这样做:
class K:
def __init__(self):
self.mems = dir(self)
def defaultMembers():
k = K()
return(k.mems)
class A:
aliases=['a','ay']
class B(A):
def __init__(self):
for k in set(dir(self))-set(defaultMembers()):
print("removing "+k)
setattr(self, k, None)
a = A()
b = B()
print(b.aliases)
#None
print(a.aliases)
#['a','ay']
我想您真正需要的是
setattr(self,“aliases”,None)
这仍然会导致None而不是non变量。不幸的是,Calss不支持删除,因为我尝试先使用del Python没有真正的私有属性。但您可以使用双下划线(\uuuuu
)来定义它:
但您仍可以通过以下方式访问它:
print(B._A__aliases)
看看这个答案:是的。我已经读过了。它没有回答这个问题,Python只是没有其他语言那样的可见性限制。(还有,你所说的“而不是让
B
意外地调用ay
”是什么意思?)因为“ay”是A的别名,但在上面也会用于B。在B
中放置别名=[]
有什么不对?我想重点是修改从类对象(B)访问别名时的行为不是类实例(b)。idk他希望如何在不实例化类变量的情况下使用它们。我希望有一些简单的解决方法,例如“\u别名”不会在扩展上被复制。我认为这个答案现在应该被删除。谢谢哦这正是我所希望的。这就是解决办法!我没有意识到“\uuuuuuuuuuuuuuuuuuuuuuuu”的混乱对类变量有效。
print(B._A__aliases)