如何解决如何克服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 举报,一经查实,本站将立刻删除。