代码之家  ›  专栏  ›  技术社区  ›  Alina

Python:在另一个文件/类中分离一些实例方法的定义

  •  0
  • Alina  · 技术社区  · 8 年前

    我有一门课:

    class Foo:
        def __init__(self, df):
            self.df = df
            self.keys = []
    
        def startJob(self):
            self.first_job()
            self.second_job()
            self.third_job()
    
        def first_job(self):
            #do soemthing with df
    
        def second_job(self):
            #do soemthing with df
    
        def third_job(self):
            #do soemthing with df
    

    作业列表可能会变得小而大,因此我想将这些作业分离到第二个文件中,并且只在let中 __init__ startJob

    2 回复  |  直到 8 年前
        1
  •  0
  •   bruno desthuilliers    8 年前

    你可以这样做:

    # jobs.py
    
    __all__ = ["jobs"]
    
    jobs = []
    
    def register(job):
        jobs.append(job)
        return job
    
    ## WARNING: the definition order is important
    
    @register
    def first_job(self):
        # ...
    
    @register
    def second_job(self): 
       # ...
    

    # foo.py
    
    from jobs import jobs
    
    class Foo:
        def __init__(self, df, jobs=jobs):
            self.jobs = jobs
            self.df = df
            self.keys = []
    
        def start_job(self):
            for job in self.jobs:
                job(self)
    
        2
  •  0
  •   RomanPerekhrest    8 年前

    可能的实现之一 依赖注入 构思:

    import pandas as pd
    
    class Foo:
        def __init__(self, df):
            self.df = df
            self.keys = []
            self.runner = FooJobRunner(self)  # initiate specialized job processor
    
        def startJob(self):
            self.runner.first_job()
            self.runner.second_job()
            self.runner.third_job()
    
    
    class FooJobRunner:
        ''' Class which serves as a job processor specifically for Foo instances '''
    
        def __init__(self, foo):
            if not isinstance(foo, Foo):
                raise TypeError('Foo instance required!')
            self.foo = foo
    
        def first_job(self):
            print(self.foo.df['a'])
            print('1st job ended\n')
    
        def second_job(self):
            print(self.foo.df['b'])
            print('2nd job ended\n')
    
        def third_job(self):
            print(self.foo.df['c'])
            print('3rd job ended\n')
    
    # sample dataframe        
    df = pd.DataFrame({'a': [1,2,3], 'b': [4,5,6], 'c': [7,8,9]})
    foo = Foo(df)
    foo.startJob()
    

    输出:

    0    1
    1    2
    2    3
    Name: a, dtype: int64
    1st job ended
    
    0    4
    1    5
    2    6
    Name: b, dtype: int64
    2nd job ended
    
    0    7
    1    8
    2    9
    Name: c, dtype: int64
    3rd job ended