不能在父方法中调用子属性,这里是测试:
#!/usr/bin/env python3
class A():
def getPath(self):
return self.__path
class B(A):
def __init__( self, name, path):
self.__name = name
self.__path = path
instance = B('test', '/home/test/Projects')
print(instance.getPath())
运行python测试文件$ ./test.py
返回
./test.py
Traceback (most recent call last):
File "./test.py", line 17, in <module>
print(instance.getPath())
File "./test.py", line 6, in getPath
return self.__path
AttributeError: 'B' object has no attribute '_A__path'
答案 0 :(得分:1)
除非您知道自己需要它,否则请勿使用__path
。 _path
足以将其标记为“私有”。但是,A.getPath
不应该尝试返回A
本身未定义的任何内容。而是从A.__init__
调用B.__init__
以确保正确完成任何A
特定初始化:
class A:
def __init__(self, path):
self._path = path
def get_path(self):
return self._path
class B(A):
def __init__(self, name, path):
super().__init__(path)
self._name = name
instance = B('test', '/home/test/Projects')
print(instance.get_path())
现在_path
已正确隔离到A
,您可以切换回__path
,例如,如果您担心子类添加它自己的_path
属性。
class A:
def __init__(self, path):
self.__path = path
def get_path(self):
return self.__path
class B(A):
def __init__(self, name, path):
super().__init__(path)
self._name = name
self._path = "foo"
instance = B('test', '/home/test/Projects')
print("{}, not {}".format(instance.get_path(), instance._path))
答案 1 :(得分:1)
您正在使用私有属性。如果使用非私有属性执行此操作,则会成功。
Python中的私有属性旨在允许每个类拥有自己的变量私有副本,而不会被子类覆盖该变量。所以在B中,__ path表示_B__path,而在A中,__ path表示__A_path。这正是Python的工作方式。 https://docs.python.org/3/tutorial/classes.html#tut-private
由于希望A能够访问__path,因此不应使用双下划线。相反,您可以使用单个下划线,这是一个约定,表示变量是私有的,而不实际执行它。
#!/usr/bin/env python3
class A():
def getPath(self):
return self._path
class B(A):
def __init__( self, name, path):
self.__name = name
self._path = path
instance = B('test', '/home/test/Projects')
print(instance.getPath())
$ ./test.py
/home/test/Projects