[英]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.