python中的变量行为提高了cod的效率

2024-09-30 05:14:51 发布

您现在位置:Python中文网/ 问答频道 /正文

尝试在类上做一些优化。我们尽量不改变太多的类定义。本质上,我们实例化了ClassAN次,但其中一个方法的文件读取很糟糕。你知道吗

for x in range(0, N):
  cl = ClassA()
  cl.dostuff(x)

这个班看起来像这样:

class ClassA:
  def dostuff(self, x):
        #open nasty file here  
        nastyfile = open()
        do something else

我们可以将从类中读取的文件带出并放在循环之前,因为文件不会更改。但是有没有一种方法可以确保我们只为类的实例打开一次讨厌的文件呢。例如,在类的第一个实例上,它是为类的所有未来实例定义的,而不必再次读入。有没有一种方法可以在当前表单中实现这一点,而不必对现有代码库的结构进行太多更改。你知道吗

有一个问题与解释器有关,即python是否足够聪明,可以像nastyfile一样缓存变量,这样我们就按原样做了,或者快速而肮脏的解决方案是:

nastyfile = open()
for x in range(0, 1):
      cl = ClassA()
      cl.dostuff(x)

想找个Python的方法来做这个。你知道吗


Tags: 文件实例方法infor定义clrange
3条回答

实例可以自己访问和修改类属性。因此,您只需在类上设置一个属性并为其提供一个默认(None)值,然后在dostuff中执行任何操作之前检查该值。示例:

class A():
    nastyfileinfo=None
    def dostuff(self,x):
        if A.nastyfileinfo: print('nastyfileinfo already exists:',A.nastyfileinfo)
        if not A.nastyfileinfo:
            print('Adding nastyfileinfo')
            A.nastyfileinfo='This is really nasty' ## open()
            print('>>>nastyfileinfo:',A.nastyfileinfo)
        ## Continue doing your other stuff involving x

for j in range(0,10):
    A().dostuff(j)

nastyfileinfo也被认为是实例的一个属性,因此您可以用实例来引用它。nastyfileinfo,但是如果您在那里修改它,它将只更新该特定实例,而如果您在类上修改它,所有其他实例都可以看到它(前提是它们没有更改对nastyfileinfo的个人/自我引用)。你知道吗

instants=[]
for j in range(0,10):
    instants.append(A())

for instance in instants:
    print(instance.nastyfileinfo)

instants[5].dostuff(5)

for instance in instants:
    print(instance.nastyfileinfo)

您可以将打开文件封装在classmethod中。你知道吗

class ClassA():

    @classmethod
    def open_nasty_file(cls):
        cls.nasty_file = open('file_path', 'file_mode')

    def do_stuff(self):
        if not hasattr(self, 'nasty_file'):
            self.open_nasty_file()

这种方法依赖于这样一个事实:如果在实例上找不到属性,属性查找将尝试在类上查找属性。你知道吗

如果希望在实例化第一个实例时打开它,可以将此检查/实例化放在__init__函数中。你知道吗

请注意,此方法将使文件保持打开状态,因此需要在某个时候关闭文件。

您可以有一个类方法,在第一个实例请求时打开该文件。我把它包在锁里,这样它就安全了。你知道吗

import threading

class ClassA:

  _nasty_file = None
  _nasty_file_lock = threading.Lock()

  def dostuff(self, x):
        #open nasty file here  
        nastyfile = get_nasty_file()
        do something else

  @classmethod
  def get_nasty_file(cls):
    with cls._nasty_file_lock:
        if cls._nasty_file is None:
            with open('nastyfile') as fp:
                cls._nasty_file = fp.read()
    return cls._nasty_file

相关问题 更多 >

    热门问题