Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 原型化基类_Python_Python 3.x - Fatal编程技术网

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。有没有一种方法可以在我的代码开始时对基类进行原型化,使其工

我遇到了一个奇怪的情况,我必须继承python文件后面定义的类,如下所示:

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是的,你是对的,我应该在答案中加上警告<代码>如果在[''''''''''''''''.'内置'.'''.'内置'.''中的''.'名称'.'':为清晰起见进行了编辑<代码>如果在[''''''''''''''''''''.'内置''.'中的''.'名称'.'':为清晰起见进行了编辑