首页 > Python中子类和父类是不是不能有同名成员变量?

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中子类和父类的成员变量不能同名吗?


不然呢?你如何区分父类和子类的变量?


你想要的是这个吗:

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的类章节里有详细的描述)
你这里的例子就是在父类里找到了。
你可能会疑惑什么地方需要这样的特性?有些底层库将一个类某些属性写死,然后让开发者继承这个类后重定义该属性,以此来改变默认值,实现定制化任务

【热门文章】
【热门文章】