代码之家  ›  专栏  ›  技术社区  ›  theReverseFlick

静态或常量,或者它们是什么?

  •  2
  • theReverseFlick  · 技术社区  · 15 年前

    我只想知道如何在这里将certian类称为设计模式中的类,比如它们在OO设计中被分类为什么类型

    (1)我使用了一个刚刚命名了常量的类,这个类直接被其他类用来获取其中常量的值,我不实例化这个类。

    (2)我使用一个包含静态方法的类,这个类基本上被其他类用作它们使用的方法的持有者。因此,我不再实例化类。

    这些类在OODesign下是什么分类的? 我能用更优雅的方式来做吗?

    2 回复  |  直到 15 年前
        1
  •  8
  •   Manoj Govindan    15 年前

    这些类在OODesign下是什么分类的?我能用更优雅的方式来做吗?

    你确实有更好的选择,imho。

    我使用一个刚刚命名为常量的类,这个类直接用于其他类,以获取其中常量的值。我不实例化该类。

    例如,在这种情况下,你不需要上课。您可以有一个设置模块来定义各种“常量”。我把常量放在引号中,因为Python中没有常量,比如Java。

    (2)我使用一个包含静态方法的类,这个类基本上被其他类用作它们使用的方法的持有者。因此,我不再实例化类。

    再说一遍,不需要上课。您可以有一个或多个模块包含这些方法,或者更确切地说,函数。它们可以按您认为合适的逻辑分组。

    我想添加一个注释,你不必坚持(Java风格?)“类专用”方法(因为缺乏更好的短语)。而是尝试编写不违背语言纹理的代码。在Python的例子中,我认为最好避免使用上面描述的类。在我看来,它们就像是Java的遗留物。

        2
  •  1
  •   Daniel Stutzbach Edward Leno    15 年前
    1. 有很多(但不是全部)的语言着重于面向对象编程(C++、C语言、Java)。 enum 键入常量,而不是将其放入类中。但是,在其他语言中,比如smalltalk和python,没有为常量进行特殊的构造,将它们放入类中是有意义的。据我所知,这门课没有什么特别的名字。

    2. 在其他语言中,静态类是不能实例化的类,它只定义常量和静态方法。尽管Python没有语言级别的支持来执行这些规则,但我仍然将以这种方式设计的类称为静态类。

    在Python2.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 声明。虽然很少,但有时静态类的类层次结构也很有用。

    静态类的另一个替代方法是singleton模式,在该模式中,您确保每个类只创建一个实例(并且通常提供返回该实例的静态方法)。