簡體   English   中英

Python:在另一個文件/類中將某些實例方法的定義分開

[英]Python: Separate the definition of some instance methods in another file/class

我有一堂課:

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

Jobs列表可能startJob ,因此我想將Jobs分成第二個文件,僅在第一個文件中使用__init__startJob 我該怎么辦?有沒有更好的方法來實現這種分離以提高可讀性?

您可以執行以下操作:

# 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)

依賴注入概念的可能實現之一:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM