【发布时间】:2010-10-02 02:49:15
【问题描述】:
我只是想知道如何在这里调用设计模式中的某些类,比如它们在 OO 设计中属于哪种类型
(1)我使用了一个刚刚命名为constants的类,这个类直接用其他类来获取里面的常量值。我没有实例化这个类。
(2) 我使用了一个充满静态方法的类,这个类基本上被其他类用作它们所使用的方法的持有者。所以我再一次没有实例化这个类。
这些属于 OOdesign 的类是什么? 我可以用更优雅的方式来做吗?
【问题讨论】:
我只是想知道如何在这里调用设计模式中的某些类,比如它们在 OO 设计中属于哪种类型
(1)我使用了一个刚刚命名为constants的类,这个类直接用其他类来获取里面的常量值。我没有实例化这个类。
(2) 我使用了一个充满静态方法的类,这个类基本上被其他类用作它们所使用的方法的持有者。所以我再一次没有实例化这个类。
这些属于 OOdesign 的类是什么? 我可以用更优雅的方式来做吗?
【问题讨论】:
这些属于 OOdesign 的类是什么?我可以用更优雅的方式来做吗?
恕我直言,您确实有更好的选择。
我使用了一个刚刚命名为常量的类,这个类直接用于其他类获取其中的常量值。我没有实例化该类。
例如在这种情况下,您不一定需要上课。您可以拥有一个定义各种“常量”的设置模块。我将常量放在引号中,因为 Python 中没有像 Java 那样的常量。
(2) 我使用了一个充满静态方法的类,这个类基本上被其他类用作它们所使用的方法的持有者。所以我再次没有实例化这个类。
同样,不需要上课。您可以拥有一个或多个包含这些方法或更确切地说是函数的模块。可以按照您认为合适的方式对它们进行逻辑分组。
我想补充一点,您不必坚持(Java 风格?)“仅类”方法(因为没有更好的短语)。而是尝试编写不违背语言本质的代码。在 Python 的情况下,我认为最好避免使用上述类。在我看来,它们就像是从 Java 继承而来的。
【讨论】:
许多(但不是全部)非常关注 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 语句。虽然很少见,但拥有静态类的类层次结构有时也很有用。
静态类的另一种替代方法是单例模式,您可以确保每次只创建一个类的实例(并且通常提供一个返回该实例的静态方法)。
【讨论】: