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

Python 实例方法可以在 __init__ 时自动定义吗?

如何解决Python 实例方法可以在 __init__ 时自动定义吗?

我想知道是否可以在执行 fetch('https://swapi.dev/api/people') .then(response=>response.json()) .then(data=>console.log(data)) 时在 Python 中自动创建实例方法。考虑这个代码示例,其中定义了一个类来处理一些音频文件格式元数据(异常处理和不相关的内容被省略):

__init__

现在:

__tags__ = ['album','artist','date','genre','title','tracknumber']

class Tags():
    def __init__(self):
        for tag in __tags__:
            setattr(self,tag,None)

    def print(self):
        for k,v in self.__dict__.items():
            if v:
                print('{}: {}'.format(k,str(v)))

    def get(self,*pa):
        ret = [getattr(k) for k in pa if k in __tags__]
        return ret if len(pa)>1 else ret[0]

    def set(self,**ka):
        for k,v in ka.items():
            if k in __tags__:
                setattr(self,k,str(v))

印刷品:

    mytags = Tags()
    mytags.set(album='The best of Ennio Morricone',artist='VarIoUs Artists')
    mytags.print()
    print()
    mytags.set(genre='Soundtrack',tracknumber=3)
    mytags.set(title='Secret Of The Sahara')
    mytags.print()
    print(mytags.album is mytags.get('album'))

假设现在我想为每个标签添加 album: The best of Ennio Morricone artist: VarIoUs Artists album: The best of Ennio Morricone artist: VarIoUs Artists genre: Soundtrack title: Secret Of The Sahara tracknumber: 3 True 方法,即 get_<tag>/set_<tag>mytags.set_album(album)。鉴于 title=mytags.get_title() 转换为 mytags.set_album(album),是否有一种 Pythonic 方法可以在创建实例时自动创建这些方法? 愚蠢的非工作示例只是为了解释我的意思:

mytags.set({'album':album,})

这将节省大量输入,最重要的是,如果 class Tags(): def __init__(self): for tag in __tags__: setattr(self,None) setattr(self,'set_'+tag<reference to passed in argument>,<reference to the respective self.set() method>) 更新,则不需要任何更改。

解决方法

是的,您可以创建函数并将它们作为实例方法绑定到实例,例如,

def __init__(...):
    tag = "album"
    def whatever_func(self,gettag=tag):
       return getattr(self,gettag)
    setattr(self,f"get_{tag}",whatever_func.__get__(self))

不过,它并不漂亮,对吧?我认为你最好定义一个 __getattr__ 来处理任何未定义的属性访问;您还应该定义 __dir__ 以便这些动态属性是制表符可完成的。

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

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?