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'
答案 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中,您可以动态地向对象/类添加属性。 如果你想“包装”多个对象 - 字典/列表似乎是一个自然的选择