静态或常数或它们是什么?

时间:2010-10-02 02:49:15

标签: python oop

我只想知道如何在这里调用设计模式中的certian类,比如它们在OO设计中被分类的类型

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

(2)我使用一个充满静态方法的类,这个类基本上被其他类用作它们使用的方法的持有者。所以我再也没有实例化这个课程。

根据OOdesign分类的这些类是什么? 我能以更优雅的方式做到吗?

2 个答案:

答案 0 :(得分:8)

  

根据OOdesign分类的这些类是什么?我能以更优雅的方式做到吗?

你有更好的选择,恕我直言。

  

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

例如在这种情况下,您不一定需要一个班级。您可以使用设置模块来定义各种“常量”。我把常量放在引号中,因为Python中没有常量,就像Java那样。

  

(2)我使用一个充满静态方法的类,这个类基本上被其他类用作它们使用的方法的持有者。所以我再没有实例化这个课程。

同样,不需要课程。您可以拥有一个或多个包含这些方法或模块的模块。它们可以按照您认为合适的方式进行逻辑分组。

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

答案 1 :(得分:1)

  1. 许多(但不是全部)强调OOP(C ++,C#,Java)的语言都有enum类型的常量,而不是将它们放在一个类中。但是,在其他语言中,例如Smalltalk和Python,常量没有特殊的构造,将它们放在类中是有意义的。据我所知,这类课程没有特别的名称。

  2. 在其他语言中,静态类是一个无法实例化的类,它只定义了常量和静态方法。尽管Python没有对执行这些规则的语言级支持,但我仍然会将这样设计的类称为静态类。

  3. 在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语句乱丢代码。虽然很少见,但有时候有一个静态类的类层次结构也很有用。

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