【问题标题】:Python class use shared state for function?Python类对函数使用共享状态?
【发布时间】:2019-03-10 21:51:10
【问题描述】:

我正在尝试改进我的 python 代码并开始使用类来对相关的方法和变量进行分组。

使用能够访问在类中初始化的变量的函数时,最佳实践是什么?我应该只访问函数中的变量吗?还是显式传递变量以明确我依赖它?

我创建了两个示例来说明这个问题的含义。首选哪种方法?

# method 1
class UploadForm(object):
    def __init__(self, form_data):
        self.file_name = form_data.get('file_name')

    def validate(self):
        agency_name = self.extract_agency_name(self.file_name)

    @staticmethod
    def extract_agency_name(file_name):
        pattern = re.search('^[CFS]Y\d{4} (.+?)[.](?:xls|csv)$', file_name, re.I)
        if pattern:
            agency_name = pattern.group(1)
            return agency_name


# method 2
class UploadForm(object):
    def __init__(self, form_data):
        self.file_name = form_data.get('file_name')

    def validate(self):
        agency_name = self.extract_agency_name()

    def extract_agency_name(self):
        pattern = re.search('^[CFS]Y\d{4} (.+?)[.](?:xls|csv)$', self.file_name, re.I)
        if pattern:
            agency_name = pattern.group(1)
            return agency_name

【问题讨论】:

  • 如果你打算使用一个类来共享状态,那么是的,使用实例变量
  • 方法二,界面尽量简洁。如果extract_agency_name 不是真正特定于任何对象,则使其成为类调用的模块函数,就像方法 1 中一样。
  • 谢谢你们俩。我会坚持方法 2,并会考虑将这些函数移到课堂之外。
  • 您的pattern 变量最好命名为match,因为它代表正则表达式匹配的结果,而不是用于搜索的模式。

标签: python function class oop


【解决方案1】:

出于以下原因,首选方法 2。

  1. 应通过self 访问成员变量。
    • 通过使用 self,您可以清楚地表明您引用的是同一对象的 file_name 变量。
  2. 装饰器可能成为开销。
    • 装饰器是方法或变量的包装器。
  3. 传递更多参数会消耗更多内存。
    • 每个参数都占用内存。

【讨论】:

  • 如果您担心装饰器的开销或与传递参数相关的内存(应该只是与名称绑定相关的内存),您不应该编写代码蟒蛇。
  • @jpmc26 与其他语言相比,您说得非常正确。我只考虑了上面的两种情况。
  • 我的意思是,您提出的性能问题是微不足道的。更改这些方面不是您应该用来优化的技术。
猜你喜欢
  • 1970-01-01
  • 2022-11-30
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-24
相关资源
最近更新 更多