静态、常量或它们是什么?
我想知道在设计模式中,某些类是怎么分类的,特别是在面向对象设计(OO设计)里它们属于哪种类型。
(1) 我有一个类,这个类里面只有一些命名常量,我在其他类中直接使用这个类来获取里面的常量值。我并没有创建这个类的实例。
(2) 我还有一个类,里面全是静态方法,这个类基本上是被其他类用来存放它们需要的方法。所以我同样没有创建这个类的实例。
这些类在面向对象设计中属于什么类型?我能否用更优雅的方式来实现这些功能?
2 个回答
很多(但不是所有)注重面向对象编程的语言,比如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
语句。虽然这种情况比较少见,但有时建立静态类的类层次结构也是有用的。
静态类的另一个替代方案是单例模式,这种模式确保类只会创建一个实例(通常会提供一个静态方法来返回这个实例)。
这些类在面向对象设计中算什么呢?我能用更优雅的方式来做吗?
我觉得你有更好的选择。
我使用一个只有命名常量的类,这个类直接被其他类用来获取里面的常量值。我并不实例化这个类。
举个例子,在这种情况下,你不一定需要一个类。你可以有一个设置模块,里面定义各种“常量”。我把常量放在引号里是因为在Python中并没有像Java那样的常量。
(2) 我使用一个充满静态方法的类,这个类基本上是被其他类用来存放它们使用的方法。所以我同样不实例化这个类。
同样,你也不需要一个类。你可以有一个或多个模块,里面包含这些方法,或者说是函数。你可以根据需要把它们逻辑上分组。
我想补充一点,你不必坚持“只有类”的做法(虽然我找不到更好的说法)。相反,尝试写一些不违背语言特性的代码。在Python中,我认为你提到的这些类最好避免使用。它们在我看来像是从Java中带过来的东西。