【问题标题】:organising classes and modules in python在 python 中组织类和模块
【发布时间】:2011-03-30 17:13:48
【问题描述】:

试图弄清楚如何将模块和类组织在一起时,我有点头疼。我来自 C++,习惯于封装处理该数据所需的所有数据和方法的类。然而在 python 中有模块,从我看过的代码来看,有些人有很多 loose 函数存储在模块中,而其他人几乎总是将他们的函数作为方法绑定到类。

例如,假设我有一个数据结构并想将其写入磁盘。

一种方法是为该对象实现一个保存方法,这样我就可以键入

MyObject.save(filename)

或类似的东西。我见过的另一种同等比例的方法是有类似的东西

from myutils import readwrite

readwrite.save(MyObject,filename)

这是一个小例子,我完全不确定这个问题在 python 中的具体情况,但我的一般问题是在函数与方法组织方面的最佳 pythonic 实践是什么?

【问题讨论】:

    标签: python oop class module


    【解决方案1】:

    似乎松散的功能困扰着您。这是蟒蛇的方式。这是有道理的,因为 python 中的模块实际上只是一个与任何其他对象处于同一基础上的对象。它确实具有从文件加载它的语言级别支持,但除此之外,它只是一个对象。

    所以如果我有一个模块foo.py:

    import pprint
    
    def show(obj):
        pprint(obj)
    

    然后当我从bar.py导入时

    import foo
    
    class fubar(object):
       #code
    
       def method(self, obj):
           #more stuff
           foo.show(obj)
    

    我实际上是在访问foo 对象上的一个方法。 foo 模块的数据属性只是foo 中定义的全局变量。模块是单例的语言级别实现,无需在每个方法参数列表中添加 self

    我尝试编写尽可能多的模块级函数。如果某些函数只适用于特定类的实例,我将使其成为该类的方法。否则,我会尝试使其适用于模块中定义的每个类的实例。

    您给出的确切示例背后的原因是,如果每个类都有一个保存方法,那么如果您稍后更改保存数据的方式(从文件系统到数据库或远程 XML 文件),那么您必须更改每个类.如果每个类都实现了一个接口来产生它想要保存的数据,那么您可以编写一个函数来保存每个类的实例,并且只更改该函数一次。这就是所谓的单一职责原则:每个班级应该只有一个改变的理由。

    【讨论】:

      【解决方案2】:

      如果您有一个常规的旧类要保存到磁盘,我会将其设为实例方法。如果它是一个可以处理不同类型对象的序列化库,我会采用第二种方式。

      【讨论】:

      • “类方法”这个词听起来像classmethod,这是不适用的。适当的东西将被称为“方法”或“实例方法”。
      猜你喜欢
      • 2011-04-20
      • 2023-03-28
      • 2011-01-13
      • 2019-07-11
      • 2017-12-01
      • 2022-12-22
      • 2018-01-08
      • 2023-03-18
      • 2010-09-15
      相关资源
      最近更新 更多