微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何克服python

如何解决如何克服python

阅读Various errors in code that tries to call classmethods之后, Why are python static/class method not callable?Are staticmethod and classmethod in python not callable?和其他显然,Python类方法不可调用。正如关于该主题的众多问题所表明的那样,“为什么”似乎没有得到很好的回答,只是说不需要它是不正确的。

无论如何,我有一个XML,在同一位置使用了许多不同的标签,每个标签都需要根本上相似但相异的处理方式。我的想法是为每个案例创建一个基类和子类,每个案例都可以解析自己的部分(元素)并对其进行操作。像这样(简化):

import xml.etree.ElementTree as ET


class base():        
    parsers = dict()
    @classmethod
    def parseXml(cls,x:str):
        parser = base.parsers.get(x)
        parser(cls,x)  # different class,but same base (and all called cls elements are only in base class)
                # or parser(el)


class derivedOne(base):
    def __init__(self):
        self.one = None
    @classmethod
    def parseXml(cls,x:str):

        d1 = derivedOne()
        d1.one = 'one+'+x
    
    base.parsers['xmlTagOne']=parseXml 


class derivedTwo(base):
    def __init__(self):
        self.two = None
    @classmethod
    def parseXml(cls,x:str):
        d2 = derivedTwo()
        d2.two = 'two+'+x

    base.parsers['xmlTagTwo']=parseXml

    if __name__ == "__main__":
        base.parseXml('xmlTagOne')
        base.parseXml('xmlTagTwo')

找到了解析器,但无法调用

当然,可以使用一些if / else逻辑从一个地方调用所有构造函数,但这不是很优雅,最重要的是,它(按我的计划)不允许在不更改基数的情况下添加其他处理程序/解析器类课...

有什么办法可以保持“在单个类中添加标记的解析”?

解决方法

您可以使用__init_subclass__将对新子类的引用存储在base.parsers中。

class Base:        
    parsers = dict()
    @classmethod
    def parseXml(cls,x:str):
        parser = base.parsers.get(x)
        parser(cls,x)

    def __init_subclass__(cls,/,tag,**kwargs):
        super().__init_subclass__(**kwargs)  # removed ...(cls,...
        Base.parsers[tag] = cls


class DerivedOne(Base,tag="xmlTagOne"):
    def __init__(self):
        self.one = None

    @classmethod
    def parseXml(cls,x:str):
        ...


class DerivedTwo(Base,tag="xmlTagTwo"):
    def __init__(self):
        self.two = None
    @classmethod
    def parseXml(cls,x:str):
        ...


if __name__ == "__main__":
    base.parsers['xmlTagOne'].parseXml(some_string)
    base.parsers['xmlTagTwo'].parseXml(some_other_string)
在创建子类后立即调用

Base.__init_subclass__,基类列表中的所有关键字参数都将传递给__init_subclass__。每个子类都使用指定的标签保存到Base.parsers


注意:我忽略了这里是否应该使用类和类方法的问题。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。