class Father:
def __init__(self):
self.value = 0
def get(self):
print self.value
class Child(Father):
def __init__(self):
self.value = 44
c = Child()
c.get() #结果输出44
难道python中子类和父类的成员变量不能同名吗?
class Father:
def __init__(self):
self.value = 0
def get(self):
print self.value
class Child(Father):
def __init__(self):
self.value = 44
c = Child()
c.get() #结果输出44
难道python中子类和父类的成员变量不能同名吗?
可以有,这正是python继承的特点。.号表示对.号前的对象调用其方法或访问其成员,而这个访问的过程,就是从继承搜索树的叶子节点,即子类开始寻找.号后面的函数或成员,如果能找到,就停止搜索;如果找不到,就往上的父类找。(learning python的类章节里有详细的描述)
你这里的例子就是在父类里找到了。
你可能会疑惑什么地方需要这样的特性?有些底层库将一个类某些属性写死,然后让开发者继承这个类后重定义该属性,以此来改变默认值,实现定制化任务
你想要的是这个吗:
class Father(object):
def __init__(self):
self.__value = 0
def get(self):
print self.__value
class Child(Father):
def __init__(self):
super(Child, self).__init__()
self.__value = 44
c = Child()
c.get() #结果输出0
双下划线开头的变量是 Python 中的私有变量,实际上是自动转换成下划线 + 类名 + 变量名的形式:
print c._Father__value # 0
print c._Child__value # 44
4 回答4.5k 阅读✓ 已解决
1 回答3.4k 阅读✓ 已解决
4 回答3.9k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
1 回答4.6k 阅读✓ 已解决
2 回答511 阅读✓ 已解决
1 回答4k 阅读✓ 已解决
不要被迷惑, 你在子类__init__函数内部重新覆盖了value变量的值而已;