关于多重继承、动态 class 创建和实例化的问题
Question about multiple inheritance, dynamic class creating and instantiation
您好,我遇到以下情况:
- 从两个父 class
继承的专门 class
- 需要在 运行 时间定义最专业的 class,基于我仅在开始从数据库读取数据时获得的一些信息。
我定义了以下代码来处理链中所有 classes 的创建:
class BusinessDocument():
@staticmethod
def get_class(doc_type):
switch = {
'MasterData': MasterData,
'Transactional': Transactional
}
func = switch.get(doc_type, lambda: "Invalid Noun Type")
return func()
def __init__(self, doc_id, location, doc_type):
self.doc_id = doc_id
self.location = location
self.doc_type = doc_type
pass
@property
def get_location(self):
return self.location
@property
def get_doc_id(self):
return self.doc_id
class MasterData(BusinessDocument):
def __init__(self, doc_id, location):
BusinessDocument.__init__(self, doc_id, location, 'MasterData')
class Transactional(BusinessDocument):
def __init__(self, doc_id, location):
BusinessDocument.__init__(self, doc_id, location, 'Transactional')
class NounClass():
@staticmethod
def get_class(doc_name, doc_type):
return type(doc_name, (BusinessDocument.get_class(doc_type),
BusinessDocument, ),dict.fromkeys(['doc_id', 'location']))
然后在 运行 时,当我得到 doc_name 时,我尝试创建一个新的 class。此时我可能没有所需的参数 doc_id 和 location 但我需要 class type.
invoice_cls = NounClass.get_class('Invoice', 'Transactional')
我收到以下错误:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-10-cb774746875a> in <module>
----> 1 invoice_cls = NounClass.get_class('Invoice', 'Transactional')
<ipython-input-9-aa5e0b316ed1> in get_class(doc_name, doc_type)
35 @staticmethod
36 def get_class(doc_name, doc_type):
---> 37 return type(doc_name, (BusinessDocument.get_class(doc_type),
38 BusinessDocument, ),dict.fromkeys(['doc_id', 'location']))
<ipython-input-9-aa5e0b316ed1> in get_class(doc_type)
7 }
8 func = switch.get(doc_type, lambda: "Invalid Noun Type")
----> 9 return func()
10
11 def __init__(self, doc_id, location, doc_type):
TypeError: __init__() missing 2 required positional arguments: 'doc_id' and 'location'
我知道这是因为 __init__() 将在 class 实例化期间被调用,但我认为该类型只会创建一个新类型而不是实例化一个马上。所以我的问题是此时是否有办法推迟实例的实例化。
提前感谢您对此提供的任何帮助和提示。
--医学博士。
初始化发生在第 9 行:
return func()
我假设你想要 return 一个 class 对象,所以删除那些括号。
另外 func 是误导,我已经将其更改为 cls:
def get_class(doc_type):
switch = {
'MasterData': MasterData,
'Transactional': Transactional
}
cls = switch.get(doc_type, lambda: "Invalid Noun Type")
return cls
您好,我遇到以下情况:
- 从两个父 class 继承的专门 class
- 需要在 运行 时间定义最专业的 class,基于我仅在开始从数据库读取数据时获得的一些信息。
我定义了以下代码来处理链中所有 classes 的创建:
class BusinessDocument():
@staticmethod
def get_class(doc_type):
switch = {
'MasterData': MasterData,
'Transactional': Transactional
}
func = switch.get(doc_type, lambda: "Invalid Noun Type")
return func()
def __init__(self, doc_id, location, doc_type):
self.doc_id = doc_id
self.location = location
self.doc_type = doc_type
pass
@property
def get_location(self):
return self.location
@property
def get_doc_id(self):
return self.doc_id
class MasterData(BusinessDocument):
def __init__(self, doc_id, location):
BusinessDocument.__init__(self, doc_id, location, 'MasterData')
class Transactional(BusinessDocument):
def __init__(self, doc_id, location):
BusinessDocument.__init__(self, doc_id, location, 'Transactional')
class NounClass():
@staticmethod
def get_class(doc_name, doc_type):
return type(doc_name, (BusinessDocument.get_class(doc_type),
BusinessDocument, ),dict.fromkeys(['doc_id', 'location']))
然后在 运行 时,当我得到 doc_name 时,我尝试创建一个新的 class。此时我可能没有所需的参数 doc_id 和 location 但我需要 class type.
invoice_cls = NounClass.get_class('Invoice', 'Transactional')
我收到以下错误:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-10-cb774746875a> in <module>
----> 1 invoice_cls = NounClass.get_class('Invoice', 'Transactional')
<ipython-input-9-aa5e0b316ed1> in get_class(doc_name, doc_type)
35 @staticmethod
36 def get_class(doc_name, doc_type):
---> 37 return type(doc_name, (BusinessDocument.get_class(doc_type),
38 BusinessDocument, ),dict.fromkeys(['doc_id', 'location']))
<ipython-input-9-aa5e0b316ed1> in get_class(doc_type)
7 }
8 func = switch.get(doc_type, lambda: "Invalid Noun Type")
----> 9 return func()
10
11 def __init__(self, doc_id, location, doc_type):
TypeError: __init__() missing 2 required positional arguments: 'doc_id' and 'location'
我知道这是因为 __init__() 将在 class 实例化期间被调用,但我认为该类型只会创建一个新类型而不是实例化一个马上。所以我的问题是此时是否有办法推迟实例的实例化。
提前感谢您对此提供的任何帮助和提示。
--医学博士。
初始化发生在第 9 行:
return func()
我假设你想要 return 一个 class 对象,所以删除那些括号。
另外 func 是误导,我已经将其更改为 cls:
def get_class(doc_type):
switch = {
'MasterData': MasterData,
'Transactional': Transactional
}
cls = switch.get(doc_type, lambda: "Invalid Noun Type")
return cls