静态、常量或它们是什么?

2 投票
2 回答
717 浏览
提问于 2025-04-16 04:52

我想知道在设计模式中,某些类是怎么分类的,特别是在面向对象设计(OO设计)里它们属于哪种类型。

(1) 我有一个类,这个类里面只有一些命名常量,我在其他类中直接使用这个类来获取里面的常量值。我并没有创建这个类的实例。

(2) 我还有一个类,里面全是静态方法,这个类基本上是被其他类用来存放它们需要的方法。所以我同样没有创建这个类的实例。

这些类在面向对象设计中属于什么类型?我能否用更优雅的方式来实现这些功能?

2 个回答

1
  1. 很多(但不是所有)注重面向对象编程的语言,比如C++、C#和Java,都有一种叫做enum的类型,用来定义常量,而不是把它们放在一个类里。不过在其他一些语言,比如Smalltalk和Python,就没有专门的常量结构,这时候把常量放在类里是有意义的。根据我所知,这种类没有特别的名称。

  2. 在其他语言中,静态类是指不能被实例化的类,它只定义常量和静态方法。虽然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语句。虽然这种情况比较少见,但有时建立静态类的类层次结构也是有用的。

静态类的另一个替代方案是单例模式,这种模式确保类只会创建一个实例(通常会提供一个静态方法来返回这个实例)。

8

这些类在面向对象设计中算什么呢?我能用更优雅的方式来做吗?

我觉得你有更好的选择。

我使用一个只有命名常量的类,这个类直接被其他类用来获取里面的常量值。我并不实例化这个类。

举个例子,在这种情况下,你不一定需要一个类。你可以有一个设置模块,里面定义各种“常量”。我把常量放在引号里是因为在Python中并没有像Java那样的常量。

(2) 我使用一个充满静态方法的类,这个类基本上是被其他类用来存放它们使用的方法。所以我同样不实例化这个类。

同样,你也不需要一个类。你可以有一个或多个模块,里面包含这些方法,或者说是函数。你可以根据需要把它们逻辑上分组。

我想补充一点,你不必坚持“只有类”的做法(虽然我找不到更好的说法)。相反,尝试写一些不违背语言特性的代码。在Python中,我认为你提到的这些类最好避免使用。它们在我看来像是从Java中带过来的东西。

撰写回答