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(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
不要被迷惑, 你在子类__init__函数内部重新覆盖了value变量的值而已;
class P(object):
def __init__(self):
self.value = 0
def get(self):
print self.value
return id(self.value)
class C(P):
def __init__(self):
super(C, self).__init__() #标准的写法是这样的, 先调用父类构造函数
self.value = 44 #两句交换一下位置看看
print C().get()
看下类的继承吧
可以有,这正是python继承的特点。.号表示对.号前的对象调用其方法或访问其成员,而这个访问的过程,就是从继承搜索树的叶子节点,即子类开始寻找.号后面的函数或成员,如果能找到,就停止搜索;如果找不到,就往上的父类找。(learning python的类章节里有详细的描述)
你这里的例子就是在父类里找到了。
你可能会疑惑什么地方需要这样的特性?有些底层库将一个类某些属性写死,然后让开发者继承这个类后重定义该属性,以此来改变默认值,实现定制化任务