【问题标题】:Static or constant or what are they?静态的还是恒定的,或者它们是什么?
【发布时间】:2010-10-02 02:49:15
【问题描述】:

我只是想知道如何在这里调用设计模式中的某些类,比如它们在 OO 设计中属于哪种类型

(1)我使用了一个刚刚命名为constants的类,这个类直接用其他类来获取里面的常量值。我没有实例化这个类。

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

这些属于 OOdesign 的类是什么? 我可以用更优雅的方式来做吗?

【问题讨论】:

    标签: python oop


    【解决方案1】:

    这些属于 OOdesign 的类是什么?我可以用更优雅的方式来做吗?

    恕我直言,您确实有更好的选择。

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

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

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

    同样,不需要上课。您可以拥有一个或多个包含这些方法或更确切地说是函数的模块。可以按照您认为合适的方式对它们进行逻辑分组。

    我想补充一点,您不必坚持(Java 风格?)“仅类”方法(因为没有更好的短语)。而是尝试编写不违背语言本质的代码。在 Python 的情况下,我认为最好避免使用上述类。在我看来,它们就像是从 Java 继承而来的。

    【讨论】:

      【解决方案2】:
      1. 许多(但不是全部)非常关注 OOP(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 语句。虽然很少见,但拥有静态类的类层次结构有时也很有用。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-22
        • 2017-12-25
        • 1970-01-01
        • 2014-01-31
        • 1970-01-01
        • 2012-03-15
        相关资源
        最近更新 更多