oop - Python中子类和父类是不是不能有同名成员变量?
怪我咯
怪我咯 2017-04-17 17:01:21
[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中子类和父类的成员变量不能同名吗?

怪我咯
怪我咯

走同样的路,发现不同的人生

全部回复(5)
PHP中文网

不要被迷惑, 你在子类__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()
PHPz

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

ringa_lee

可以有,这正是python继承的特点。.号表示对.号前的对象调用其方法或访问其成员,而这个访问的过程,就是从继承搜索树的叶子节点,即子类开始寻找.号后面的函数或成员,如果能找到,就停止搜索;如果找不到,就往上的父类找。(learning python的类章节里有详细的描述)
你这里的例子就是在父类里找到了。
你可能会疑惑什么地方需要这样的特性?有些底层库将一个类某些属性写死,然后让开发者继承这个类后重定义该属性,以此来改变默认值,实现定制化任务

PHP中文网

看下类的继承吧

高洛峰

你想要的是这个吗:

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
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号