如何在Python运行时向外部类添加方法?

2024-06-02 06:07:52 发布

您现在位置:Python中文网/ 问答频道 /正文

PyGithub似乎不支持GitHub API call to acquire the latest release。我想知道我是否可以在运行时向PyGithub添加一个方法来为我做到这一点。你知道吗

例如,现有代码具有以下方法:

# Repository.py
def get_releases(self):
    """
    :calls: `GET /repos/:owner/:repo/releases <http://developer.github.com/v3/repos>`_
    :rtype: :class:`github.PaginatedList.PaginatedList` of :class:`github.Tag.Tag`
    """
    return github.PaginatedList.PaginatedList(
        github.GitRelease.GitRelease,
        self._requester,
        self.url + "/releases",
        None
    )

我想把这个加到存储库.py班级:

def get_latest_release(self):
    return github.PaginatedList.PaginatedList(
        github.GitRelease.GitRelease,
        self._requester,
        self.url + "/releases/latest",
        None
    )

我尝试了这个,但收到了一个错误:

# main.py

from types import MethodType
from github import Github
from github.Repository import Repository, github

def get_latest_release(self): ...

def main():
    Repository.method = MethodType(get_latest_release, None, Repository)
    g = Github(<my name>, <my password>)
    org = g.get_organization(<name of org>)
    repo = org.get_repo(<name of repository>)
    release = repo.get_latest_release()

    # AttributeError: 'Repository' object has no attribute 'get_latest_release'

是否可以在运行时添加此方法?你知道吗


Tags: of方法pyselfgithubnonegetrelease
1条回答
网友
1楼 · 发布于 2024-06-02 06:07:52

直接分配给Repository.get_latest_release就足够了,例如:

Repository.get_latest_release = get_latest_release

如果您试图分配给一个实例,那么只需要MethodType,例如

>>> import types
>>> class A(object):
...     pass
>>> a = A()
>>> A.one = lambda self: 1
>>> a.two = types.MethodType(lambda self: 2, a)
>>> a.one(), a.two()
(1, 2)

class赋值可用于该类的所有实例时,instance赋值不是:

>>> b = A()
>>> b.one()
1
>>> b.two()
AttributeError: 'A' object has no attribute 'two'

相关问题 更多 >