我只想知道如何在这里调用设计模式中的certian类,比如它们在OO设计中被分类的类型
(1)我使用一个刚刚命名为常量的类,这个类直接用于其他类来获取其中的常量值。我不实例化该类。
(2)我使用一个充满静态方法的类,这个类基本上被其他类用作它们使用的方法的持有者。所以我再也没有实例化这个课程。
根据OOdesign分类的这些类是什么? 我能以更优雅的方式做到吗?
答案 0 :(得分:8)
根据OOdesign分类的这些类是什么?我能以更优雅的方式做到吗?
你有更好的选择,恕我直言。
我使用一个刚刚命名为常量的类,这个类直接用于其他类来获取其中的常量值。我不实例化该类。
例如在这种情况下,您不一定需要一个班级。您可以使用设置模块来定义各种“常量”。我把常量放在引号中,因为Python中没有常量,就像Java那样。
(2)我使用一个充满静态方法的类,这个类基本上被其他类用作它们使用的方法的持有者。所以我再没有实例化这个课程。
同样,不需要课程。您可以拥有一个或多个包含这些方法或模块的模块。它们可以按照您认为合适的方式进行逻辑分组。
我想添加一个注释,你不必坚持(Java风格?)“仅限类”的方法(因为缺少一个更好的短语)。而是尝试编写不违背语言的代码。在Python的情况下,我认为最好避免使用上面描述的类。在我看来,它们就像是Java中的遗留物。
答案 1 :(得分:1)
许多(但不是全部)强调OOP(C ++,C#,Java)的语言都有enum
类型的常量,而不是将它们放在一个类中。但是,在其他语言中,例如Smalltalk和Python,常量没有特殊的构造,将它们放在类中是有意义的。据我所知,这类课程没有特别的名称。
在其他语言中,静态类是一个无法实例化的类,它只定义了常量和静态方法。尽管Python没有对执行这些规则的语言级支持,但我仍然会将这样设计的类称为静态类。
在Python 2.6或更高版本中,您可以使用类装饰器来强制执行规则:
def staticclass(cls):
"""Decorator to ensure that there are no unbound methods and no instances are
created"""
for name in cls.__dict__.keys():
ob = getattr(cls, name)
if isinstance(ob, types.MethodType) and ob.im_self is None:
raise RuntimeError, "unbound method in class declared no_instances"
def illegal(self):
raise RuntimeError,"Attempt to instantiate class declared no_instances"
cls.__init__ = illegal
return cls
@staticclass
class MyStaticClass(object):
pass
正如Manoj指出的那样,很多时候你可以取消该类并将常量或函数放在模块级别。但是,有些情况下,有一个班级确实很有用。例如,如果类具有重要状态,则将函数放在模块级别需要使用global
语句乱丢代码。虽然很少见,但有时候有一个静态类的类层次结构也很有用。
静态类的另一种替代方法是单例模式,您可以确保每个模型只创建一个实例(并且通常提供一个返回该实例的静态方法)。