Python 在单独的 py 文件中定义 class 函数
Python define class functions in seperate py file
我正在从事一个处理数据分析的项目。为了简化查找和修改函数的过程,我决定将用途相似的函数放在不同的py文件中。当一个 py 文件中的函数需要另一个 py 文件中的函数才能工作时,就会出现问题。我想我可以通过使用 class 来解决这个问题。为了演示我正在尝试实施的解决方案,我有三个文件:
a.py
def a1(self):
self.var=3
def a2(self):
self.b1(4)
b.py
def b1(self, x):
self.var=x
def b2(self):
self.a1()
testClass.py
class test(object):
def __init__(self):
self.var=0
from b import *
from a import *
a=test()
print a.var
a.a1()
print a.var
a.a2()
print a.var
a.b2()
print a.var
这确实满足了我的要求,但 Python 对我以这种方式导入这 2 个 py 文件感到不满。在 C++ 中,我可以只对我的函数进行原型设计、前向声明,然后将它们的定义放在另一个文件中,没有任何问题。在 class 定义不在的 py 文件中为 class 定义函数的正确方法是什么?
你不需要类,你只需要重新考虑你的功能的责任。一般来说,任何情况下 A
取决于 B
而 B
取决于 A
你会感到困惑。
您通常想要的是:
C
取决于 A
和 B
A
取决于 B
,反之亦然
例如,您可能有一个模块用于获取和解析数据,另一个模块用于处理数据。所以你可能有 data
和 processing
。你可以有这样的东西:
A -> B 样式
processing.py
import data
def process_something():
something = data.get_something()
for thing in something:
print('This is a thing: {}'.format(thing))
def process_something_else():
something_else = data.get_something_else()
for thing in something_else:
print('This is something else: {}'.format(thing))
** data.py **
def get_something():
with open('file.txt') as f:
return f.readlines()
def get_something_else():
with open('another.txt') as f:
return f.readlines()
您会注意到 processing
中的函数仅依赖于 data
中的函数,而不是相反。你不想重新安排它,所以你在一个文件中有 process_something
和 get_something
,在另一个文件中有 process_something_else
和 get_something_else
。
或者,您可以让 processing
更加不可知。
C -> A 和 C -> B 样式
your_program.py
import data
import processing
processing.process_something(data.get_something())
processing.process_something_else(data.get_something_else())
processing.py
def process_something(something):
for thing in something:
print('This is a thing: {}'.format(thing))
def process_something_else(something):
for thing in something:
print('This is something else: {}'.format(thing))
和data.py看起来一样
为避免混淆,在 a.py
和 b.py
中,将您的实现函数重命名为 a1_impl
、a2_impl
、...(或其他一些一致的命名约定)。
更新代码:
from b import *
from a import *
class test(object):
a1 = a1_impl # and however many others you need
b1 = b1_impl
def __init__(self):
self.var=0
在 Python 2.7.10.
上测试
class
中的赋值语句正在创建 class 属性,这些属性将被复制到每个实例中。这些属性恰好是具有正确签名的函数,因此它们可以作为您的 class 个实例的成员函数被调用。
使用混合 类:
# In a.py
class A(object):
def a1(self):
self.var=3
def a2(self):
self.b1(4)
# In b.py
class B(object):
def b1(self, x):
self.var=x
def b2(self):
self.a1()
# In testclass.py
class Test(A, B):
def __init__(self):
self.var=0
我正在从事一个处理数据分析的项目。为了简化查找和修改函数的过程,我决定将用途相似的函数放在不同的py文件中。当一个 py 文件中的函数需要另一个 py 文件中的函数才能工作时,就会出现问题。我想我可以通过使用 class 来解决这个问题。为了演示我正在尝试实施的解决方案,我有三个文件:
a.py
def a1(self):
self.var=3
def a2(self):
self.b1(4)
b.py
def b1(self, x):
self.var=x
def b2(self):
self.a1()
testClass.py
class test(object):
def __init__(self):
self.var=0
from b import *
from a import *
a=test()
print a.var
a.a1()
print a.var
a.a2()
print a.var
a.b2()
print a.var
这确实满足了我的要求,但 Python 对我以这种方式导入这 2 个 py 文件感到不满。在 C++ 中,我可以只对我的函数进行原型设计、前向声明,然后将它们的定义放在另一个文件中,没有任何问题。在 class 定义不在的 py 文件中为 class 定义函数的正确方法是什么?
你不需要类,你只需要重新考虑你的功能的责任。一般来说,任何情况下 A
取决于 B
而 B
取决于 A
你会感到困惑。
您通常想要的是:
C
取决于A
和B
A
取决于B
,反之亦然
例如,您可能有一个模块用于获取和解析数据,另一个模块用于处理数据。所以你可能有 data
和 processing
。你可以有这样的东西:
A -> B 样式
processing.py
import data
def process_something():
something = data.get_something()
for thing in something:
print('This is a thing: {}'.format(thing))
def process_something_else():
something_else = data.get_something_else()
for thing in something_else:
print('This is something else: {}'.format(thing))
** data.py **
def get_something():
with open('file.txt') as f:
return f.readlines()
def get_something_else():
with open('another.txt') as f:
return f.readlines()
您会注意到 processing
中的函数仅依赖于 data
中的函数,而不是相反。你不想重新安排它,所以你在一个文件中有 process_something
和 get_something
,在另一个文件中有 process_something_else
和 get_something_else
。
或者,您可以让 processing
更加不可知。
C -> A 和 C -> B 样式
your_program.py
import data
import processing
processing.process_something(data.get_something())
processing.process_something_else(data.get_something_else())
processing.py
def process_something(something):
for thing in something:
print('This is a thing: {}'.format(thing))
def process_something_else(something):
for thing in something:
print('This is something else: {}'.format(thing))
和data.py看起来一样
为避免混淆,在
a.py
和b.py
中,将您的实现函数重命名为a1_impl
、a2_impl
、...(或其他一些一致的命名约定)。更新代码:
from b import * from a import * class test(object): a1 = a1_impl # and however many others you need b1 = b1_impl def __init__(self): self.var=0
在 Python 2.7.10.
上测试class
中的赋值语句正在创建 class 属性,这些属性将被复制到每个实例中。这些属性恰好是具有正确签名的函数,因此它们可以作为您的 class 个实例的成员函数被调用。
使用混合 类:
# In a.py
class A(object):
def a1(self):
self.var=3
def a2(self):
self.b1(4)
# In b.py
class B(object):
def b1(self, x):
self.var=x
def b2(self):
self.a1()
# In testclass.py
class Test(A, B):
def __init__(self):
self.var=0