2017-03-27 5 views
0

PyGithubは、GitHub API call to acquire the latest releaseをサポートしていないようです。実行時にPyGithubにメソッドを追加できるかどうかは私には分かりません。Pythonで実行時に外部クラスにメソッドを追加するには?

例えば、既存のコードは次のような方法があります。

# 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 
    ) 

を私はRepository.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' 

実行時にこのメソッドを追加することはできますか?

+0

のGitHubの子クラスを作成しないのはなぜ:class割り当てがinstance割り当てがない場合、そのクラスのすべてのインスタンスに利用可能である

>>> 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) 

? – DyZ

+1

なぜあなたは 'Repository.method'に割り当てましたか?なぜ方法? – user2357112

+1

'Repository.get_latest_release = get_latest_release'で十分ではないでしょうか。インスタンスに割り当てようとしている場合は、 'MethodType'だけが必要です。 'repo.get_lastest_release = MethodType(get_latest_release、repo)' – AChampion

答えて

2

Repository.get_latest_releaseに直接割り当てると、例えば、インスタンスに割り当てるしようとしていた場合にのみMethodTypeが必要になり

Repository.get_latest_release = get_latest_release 

sufficients、例えば:でなければなりません

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

パーフェクト!ありがとうございました。 – TERACytE

関連する問題