这个python方法定义在哪里?

时间:2016-03-23 11:24:02

标签: python

我目前正在阅读virt-manager / virt-clone的代码,但之前没有做太多的python。

以下是代码的重要部分:

https://github.com/virt-manager/virt-manager/blob/master/virt-clone#L169

conn = cli.getConnection(options.connect)
design = Cloner(conn)

https://github.com/virt-manager/virt-manager/blob/master/virtinst/cli.py#L263

from .connection import VirtualConnection
conn = VirtualConnection(uri)

https://github.com/virt-manager/virt-manager/blob/master/virtinst/connection.py#L35

class VirtualConnection(object):

https://github.com/virt-manager/virt-manager/blob/master/virtinst/cloner.py#L591

return self.conn.lookupByName(name)

最后一行看起来有一个方法lookupByName为类VirtualConnection的对象调用。但是,我找不到在该类中定义的这种方法,也没有父类来从中获取这样的方法。

你能帮我看一下定义lookupByName的地方吗?

自己找到这样一个答案的好方法是什么? (调试器等?)

3 个答案:

答案 0 :(得分:2)

lookupByName对象的virConnect方法在C中定义为libvirt的Python绑定的一部分。以下代码将属性访问权转发给libvirt.openAuth返回并分配给self._libvirtconn的对象:

https://github.com/virt-manager/virt-manager/blob/master/virtinst/connection.py#L94

def __getattr__(self, attr):
    if attr in self.__dict__:
        return self.__dict__[attr]

    # Proxy virConnect API calls
    libvirtconn = self.__dict__.get("_libvirtconn")
    return getattr(libvirtconn, attr)

这会导致conn.lookupByNameconn._libvirtconn.lookupByName

答案 1 :(得分:0)

我还没有调查过您的情况,但在Python中,方法可以动态地添加到类或实例中

angular.module('MyApp')
        .controller('MainCtrl', ['$rootScope', '$scope','FileUploader','$location', 'myService', function ($rootScope, $scope,FileUploader,$location, myService) {
         var uploader = $scope.uploader = new FileUploader({
        url: 'upload.php'
    });
     //Any other code or processing

        }]);

结果是:

class A:
    def a(self):
        print 'a'

class C(A):
    def c(self):
        print 'c'

def foo(arg):
    print 'foo',arg

a = C()
print dir(a)

C.f = foo

a.a()
a.c()
a.f()
print dir(a)

正如你所看到的,对dir的第二次调用显示了新的方法' f'。所以在某些情况下找到它的起源可能很棘手。

答案 2 :(得分:0)

您引用的VirtualConnection类具有__getattr__的实现,这是在无法解析属性时将调用的方法。

__getattr__方法在" _lvvirtconn"上查找属性。 VirtualConnection实例的属性。

另请参阅:https://docs.python.org/3/reference/datamodel.html#object.getattr