避免覆盖超类变量。整形或替代

用户

我有一个包含多个类大型程序

class Dog(object):    
    def __init__(self):
        self.food = 10

    def print_dog_food(self):
        print(self.food)


class Cat(object):    
    def __init__(self):
        self.food = 5

    def print_cat_food(self):
        print(self.food)

它们被其他类继承:

class AllAnimals(Cat, Dog):
    def __init__(self):
        Cat.__init__(self)
        Dog.__init__(self)

一些变量将具有相似的名称。我担心会意外覆盖现有变量并创建令人讨厌的错误:

# Wrong result. 
AllAnimals().print_cat_food()  # prints 10
AllAnimals().print_dog_food()  # prints 10

跟踪所有这些变量以避免发生意外似乎是不切实际的,因此我在考虑使用mangling:

def __init__(self):
    self.__food = ...... 

并得到我的期望:

# Correct result.
AllAnimals().print_cat_food()  # prints 5
AllAnimals().print_dog_food()  # prints 10

Mangling解决了我的问题,但阅读此极受好评的答案时指出:

如果您想最终使用它,可以,但是既不推荐也不推荐使用。

答案的“这就是文化”部分使我感到怀疑。

问题
-我是否应该像示例中那样使用重整?
-如果不是,那么我有什么选择来避免意外覆盖变量?

马丁·彼得斯(Martijn Pieters)

既不常用也不建议使用mangling来产生“私有”属性,因为在Python中没有真正的私有属性。

使用mangling来完成其设计工作,减少子类与属性名称冲突的可能性,这绝对是pythonic的。

文档中

当在类定义的上下文中使用时,此类别中的名称将被重写,以使用变形的形式来帮助避免基类和派生类的“私有”属性之间的名称冲突

强调我的。

但是,用例很少见。在很多情况下,您都希望属性不会被意外覆盖。但是,如果您构建将被广泛子类化的基类(在大型项目中或作为旨在广泛使用的框架或库的一部分),则对实现细节使用双下划线名称是完全可以的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章