我已经是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)
我意识到第二种方法比第一种方法更优雅,但我告诉他那个 第一种方法更方便。我告诉他我没有看到任何问题,但他不相信。 第一种方法是如此糟糕吗?为什么?
答案 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,您就知道在哪里找到它。