【发布时间】:2019-08-12 23:50:48
【问题描述】:
我有一个函数make_package 返回一个类Package。在另一个文件中,我想导入类Package,所以我可以进行类型检查。我的问题是,如何导入函数内部的类?
以下不是确切的代码,但结构相似。
# project/package.py
def make_package(ori, dest):
class Package:
origin = ori
destination = dest
def __init__(self, item):
self.item = item
def to_str(self):
return self.origin + '-' + self.destination + ' : ' + self.item
return Package
# project/shipment.py
# Don't know how to import Package from package.py
class Shipment:
def __init__(self, **kwargs):
self.shipment = dict()
for container in kwargs.keys():
self.shipment[container] = list()
for item in kwargs[key]:
if type(item) != Package:
raise TypeError('Item must be packed in Package.')
self.shipment[container].append(item.to_str())
# project/main.py
from .package import make_package
from .shipment import Shipment
us_fr = make_package('US', 'FR')
fr_cn = make_package('FR', 'CN')
shipment = Shipment(container1=[us_fr('item1'), fr_cn('item2')], container2=[us_fr('item3'), fr_cn('item4')])
print(shipment.shipment)
# {
# 'container1' : [
# 'US-FR : item1',
# 'FR-CN' : 'item2'
# ],
# 'container2' : [
# 'US-FR : item3',
# 'FR-CN' : 'item4'
# ]
# }
我知道实现类型检查的一种方法是在Shipment 中使用make_package 创建一个虚拟 变量,然后将type(item) 与type(dummy) 进行比较。然而,它似乎更像是一个黑客。不知道有没有更好的办法?
【问题讨论】:
-
为什么类在函数里面?为什么不将其留在全局范围内?你想通过把它放在函数中来实现什么?
-
最好的解决方案是将
Package移到函数之外。除非您将来打算将make_package用作工厂函数,否则您甚至不需要该函数。 -
因为我希望类从函数中继承
ori和dest值,但只使用item创建对象。这样我可以多次重用变量,例如us_fr,因为我以后会更多地使用它。如果我把课程放在外面,我可能每次都必须传递 3 个参数__init__(ori, dest, item)。后来使代码变得超级混乱。 -
@KevinWelch 在我的真实代码中,有更多的类变量
Package继承自make_package的参数。如果我每次都使用所有这些参数创建Package对象,它会变得非常混乱。我觉得如果我可以先使用make_package分配这些参数,然后只在创建新实例时传入item,那会更干净,因为item是唯一每次都不同的变量。 -
@Phoenix-C: 会使用
functools.partial绑定公共参数以使只需要item的构造函数工作吗?这将使Package保持为单例,同时仍然让您拥有使用通用数据构造它的简化接口。
标签: python python-3.x nested class-factory