Python和OO编程(类属性和派生类)

时间:2011-01-21 02:13:57

标签: python oop class attributes

我已经是Java程序员4,5年了。现在我已经切换到Python(主要原因是我现在是一名自由职业者而且我独自工作)。我为我的客户提供源代码,有时我必须激励我的设计选择。现在回答这个问题。 我必须支持我的设计选择:

class Base(object):
    def foo(self):
        self.dosomethig(self.clsattr1)
        self.dosomethig(self.clsattr2)

class Derived(Base):
    clsattr1 = value1
    clsattr2 = value2

基类总是要扩展或派生 我的客户(一个java程序员)争辩说,从OO的角度来看,我的方法并不优雅。 他声称以下方法更好:

class Base(object):
    def __init__(self, clsattr1, clsattr2):
        self.clsattr1 = clsattr1
        self.clsattr2 = clsattr2

    def foo(self):
        self.dosomethig(self.clsattr1)
        self.dosomethig(self.clsattr2)

class Derived(Base):
    def __init__(self):
        super(Derived, self).__init__(value1, value2)

我意识到第二种方法比第一种方法更优雅,但我告诉他那个 第一种方法更方便。我告诉他我没有看到任何问题,但他不相信。 第一种方法是如此糟糕吗?为什么?

3 个答案:

答案 0 :(得分:3)

似乎没有任何差别。不要浪费你的时间与他争论 - 重建你的课程并拿走钱可能会更快。

答案 1 :(得分:0)

如果Base类需要值来做它的事情,那么它应该是显式的。

在其他编程语言中,需求可以使用抽象方法设置,每个值一个,但不是Python样式,并且模拟它会很麻烦。

这些示例之间最有趣的区别是第一个代码片段尝试使用Base类的类变量,这将影响每个派生类及其所有实例。它应该是哪种方式?每个层次的值?每个派生类?每个实例?

在最好的pythonic样式中,如果对象可以设置自己的初始化值,那么Base类应该为它们使用合理的默认值,并为子类及其实例提供一种机制来覆盖它们。

class Base(object):
    def __init__(self, attr1=DEFAULT1, attr2=DEFAULT2):
        self.attr1 = attr1
        self.attr2 = attr2

答案 2 :(得分:-5)

与Java相比,第二个片段只能称为“优雅”。不仅仅是它的两倍,使用'__'变量是一个明显的迹象,表明程序员正在与语言作斗争,并且存在很多可能的错误。

如果您(或您的客户)想要Java,您就知道在哪里找到它。

相关问题