Python 原型化基类
我遇到了一个奇怪的情况,我必须继承python文件后面定义的类,如下所示:Python 原型化基类,python,python-3.x,Python,Python 3.x,我遇到了一个奇怪的情况,我必须继承python文件后面定义的类,如下所示: class Client(BaseClient): def __init__(self, url): super().__init__(url) ... ... class BaseClient: def __init__(self, url): ... 我不能这样做,因为从它继承时未定义BaseClient。有没有一种方法可以在我的代码开始时对基类进行原型化,使其工
class Client(BaseClient):
def __init__(self, url):
super().__init__(url)
...
...
class BaseClient:
def __init__(self, url):
...
我不能这样做,因为从它继承时未定义
BaseClient
。有没有一种方法可以在我的代码开始时对基类进行原型化,使其工作?或者另一种解决方法?一种解决方案是在函数中定义它:
def get_class():
class Client(BaseClient):
def __init__(self, url):
super().__init__(url)
return Client
class BaseClient:
def __init__(self, url):
self.url = url
Client = get_class()
c = Client('hello')
print(c.url)
印刷品:
hello
注意:只有在没有任何其他(更干净的)解决方案的情况下才执行此操作。代码可能很快变得丑陋…一种解决方案是在函数中定义它:
def get_class():
class Client(BaseClient):
def __init__(self, url):
super().__init__(url)
return Client
class BaseClient:
def __init__(self, url):
self.url = url
Client = get_class()
c = Client('hello')
print(c.url)
印刷品:
hello
注意:只有在没有任何其他(更干净的)解决方案的情况下才执行此操作。代码可能会很快变得丑陋…也许我可以放弃继承并拉取如下内容:
class Client:
def __init__(self, base_client):
self.base_client = base_client
...
def main()
base_client = BaseClient(url)
client = Client(base_client)
client.base_client.do_stuff()
client.do_other_stuff()
class BaseClient:
def __init__(self, url):
...
main()
也许我可以放弃继承权,这样做:
class Client:
def __init__(self, base_client):
self.base_client = base_client
...
def main()
base_client = BaseClient(url)
client = Client(base_client)
client.base_client.do_stuff()
client.do_other_stuff()
class BaseClient:
def __init__(self, url):
...
main()
不,您需要重新排列文件。还请注意,您缺少了
self
。房间里的大象:为什么?!简而言之,这是因为代码是从外部粘贴并附加到文件底部的。好吧,你不应该从外部粘贴代码并附加到文件底部。这似乎是个聪明的主意,但它完全错了。一定有更好的解决办法。@liorblob您能不能再详细介绍一下情况,它是如何发生的,等等?不,您需要重新排列文件。还请注意,您缺少了self
。房间里的大象:为什么?!简而言之,这是因为代码是从外部粘贴并附加到文件底部的。好吧,你不应该从外部粘贴代码并附加到文件底部。这似乎是个聪明的主意,但它完全错了。一定有更好的解决办法。@liorblob你能再详细说明一下情况是什么,它是如何发生的,等等吗?我希望他们不要这样做。或者至少永远不要让任何人维护代码。@zvone是的,你是对的,我应该在答案中添加警告……我希望他们不要这样做。或者至少永远不要让任何人维护代码。@zvone是的,你是对的,我应该在答案中加上警告<代码>如果在[''''''''''''''''.'内置'.'''.'内置'.''中的''.'名称'.'':为清晰起见进行了编辑<代码>如果在[''''''''''''''''''''.'内置''.'中的''.'名称'.'':为清晰起见进行了编辑