Python类没有public/private的概念,所以我们被告知不要触及以下划线开头的东西,除非我们创建它。但是这并不需要我们直接或间接继承的所有类的完整知识吗?证人:Python是否需要继承链中所有类的知识?
class Base(object):
def __init__(self):
super(Base, self).__init__()
self._foo = 0
def foo(self):
return self._foo + 1
class Sub(Base):
def __init__(self):
super(Sub, self).__init__()
self._foo = None
Sub().foo()
预期地,当None + 1
被评估TypeError
上升。所以我必须知道_foo
存在于基类中。为了解决这个问题,__foo
可以用来代替,它通过改变名称来解决问题。这似乎是一种可以接受的解决方案,如果不是优雅的话。然而,如果Base
继承自一个名为Sub
的类(在单独的包中)会发生什么?现在__foo
在我的Sub
中重写__foo
在祖父母Sub
中。
这意味着我必须知道整个继承链,包括每个使用的所有“私有”对象。 Python是动态类型的这一事实使得这更加困难,因为没有声明来搜索。然而,最糟糕的部分可能是Base
现在可能继承object
的事实,但在未来的某个版本中,它将切换为从Sub
继承。很显然,如果我知道Sub
是从继承的,我可以重命名我的班级,然而令人讨厌的是。但我看不到未来。
这不是真正的私人数据类型可以防止问题的情况吗?在Python中,如果这些脚趾可能会在未来某个时刻出现,我是否可以确定我不会意外踩到某人的脚趾?
编辑:我显然没有说清楚主要问题。我熟悉名称的改变以及单个和双下划线之间的区别。问题是:我该如何处理这样的事实,即我可能会碰到类别,这些类别的存在我现在不知道?如果我的父类(它在一个我没有写的包中)碰巧开始从与我的类同名的类继承,即使名称修改也无济于事。我认为这是一个真正的私人成员可以解决的(角落)情况,但我认为Python有问题吗?
编辑:按照要求,下面是一个完整的例子:
文件parent.py
:
class Sub(object):
def __init__(self):
self.__foo = 12
def foo(self):
return self.__foo + 1
class Base(Sub):
pass
文件sub.py
:
import parent
class Sub(parent.Base):
def __init__(self):
super(Sub, self).__init__()
self.__foo = None
Sub().foo()
祖父母的foo
叫,但我使用__foo
。
显然你不会自己写这样的代码,但parent
可以很容易地由第三方提供,其细节可以在任何时候改变。
你可以发布一个例子来演示这个地方其他同名的类不会完全影响你现有的类吗..或者我还是不明白..nevermind ...我做了一个和你的权利我猜这是一个角落case ...只是尽量不要使用常见的私人var /类名称我猜 – 2012-07-24 22:04:01