我有一个包含多个类的大型程序。
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解决了我的问题,但阅读此极受好评的答案时指出:
如果您想最终使用它,可以,但是既不推荐也不推荐使用。
答案的“这就是文化”部分使我感到怀疑。
问题:
-我是否应该像示例中那样使用重整?
-如果不是,那么我有什么选择来避免意外覆盖变量?
既不常用也不建议使用mangling来产生“私有”属性,因为在Python中没有真正的私有属性。
使用mangling来完成其设计工作,减少子类与属性名称冲突的可能性,这绝对是pythonic的。
从文档中:
当在类定义的上下文中使用时,此类别中的名称将被重写,以使用变形的形式来帮助避免基类和派生类的“私有”属性之间的名称冲突。
强调我的。
但是,用例很少见。在很多情况下,您都希望属性不会被意外覆盖。但是,如果您要构建将被广泛子类化的基类(在大型项目中或作为旨在广泛使用的框架或库的一部分),则对实现细节使用双下划线名称是完全可以的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句