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

2024-09-30 19:28:21 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

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

^{pr2}$

我知道第二种方法比第一种方法优雅得多,但我告诉他 第一种方法更方便。我告诉他我看不出任何问题,但他不相信。 第一种方法有那么糟糕吗?为什么呢?在


Tags: 方法selfbase客户object源代码def原因
3条回答

似乎没有任何区别。不要浪费你的时间和他争论-也许重构你的类并拿走钱会更快。在

如果Base类需要值来完成它的工作,那么它应该是显式的。在

在其他编程语言中,可以使用抽象方法来设置需求,每个值对应一个方法,但这不是Python风格的,模拟它会很麻烦。在

两个示例之间最有趣的区别是第一个代码片段尝试使用基类的类变量,这将影响每个派生类及其所有实例。应该走哪条路?每个层次的值?每个派生类?每个实例?在

在最好的python风格中,如果对象可以设置自己的初始化值,那么Base类应该为它们使用合理的默认值,并为子类及其实例提供重写它们的机制。在

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

与Java相比,第二个代码段只能称为“优雅”。不仅它的长度几乎是原来的两倍,而且使用'uuuu'变量是程序员正在与这种语言抗争的一个明显的迹象,而且还有很多可能的错误。在

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

相关问题 更多 >