包装类是否“不好”?

时间:2014-01-05 10:37:05

标签: python

IRC上有人告诉我使用类作为包装是不好的 - 我认为他对python有一些经验的人 我来自.NET,通常的做法是使用包装类

为什么使用包装类是不好的风格?

当然我可以使用郁金香 - 但我看不出任何好处 正如volcano所说,郁金香也是不可变的 它们也不是可继承的

包装类

class Movie(object):
    def __init__(self):
        self.title = ''
        self.plot = ''
        ...
    # no functions / methods in here - only variables

在此课程中使用Movie

class Foo(object):
    def bar(self):
        movie = Movie()
        movie.title = 'Ice Age'

3 个答案:

答案 0 :(得分:1)

您可以通过sqlalchemy看到这一点,其中模型可能被定义为:

class Note(Base):
    __tablename__ = 'notes'
    id = Column(Integer, primary_key=True)
    name = Column(Text, unique=True)
    html = Column(Text)
    created = Column(DateTime)
    tags = relationship('Tag', secondary=note_tags)

class Tag(Base):
    __tablename__ = 'tags'
    id = Column(Integer, primary_key=True)
    name = Column(Text, unique=True)

...然后存在一个包含各种操作的辅助类,因此通过查看一个文件中的类可以很容易地理解该模型,而不是在下面无休止地布置分散的帮助函数。 / p>

我没有看到任何特殊原因,这是一个糟糕的主意。

通常,您不应该使用类函数。这可能是评论来源的地方?命名空间(模块)已经执行该角色。

即。如果你有一个Foo类,而且你经常使用:

package.Foo.bar(...)

简单地将bar方法直接放在包中,并像这样使用它:

package.bar(...)

没有必要在这个类上放置这样的函数;这是一种非常常见的c#模式。 ...但它仅适用于类函数和静态函数,其中没有任何有意义的理由将它们附加到类。

答案 1 :(得分:1)

我可能错了,但评论的目的可能是避免使用anemic domain model,因为显而易见hated by Martin Fowler。简而言之,那些人问的问题是:“为什么首先使用OO,当你只使用DTO时。 DTO是数据传输对象,即没有行为的对象,更像是结构。那些家伙喜欢entities and value objects

虽然你的朋友的意思很难说清楚,因为有许多关于OO设计的思想流派。

实际上,你的包装器确实缺乏存在的理由。它当前所做的也可以由构造函数或工厂函数/方法处理,也可以作为Movie的类方法。如果您打算使用包装器通常将行为与数据分开,请参阅上面的讨论,并选择一方。 ;)

答案 2 :(得分:0)

如果每个属性对象只包装一个对象 - 它似乎没用。特别是因为在Python中,您可以动态地向对象/类添加属性。 如果你想“包装”多个对象 - 字典/列表似乎是一个自然的选择