我目前正在阅读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
的地方吗?
自己找到这样一个答案的好方法是什么? (调试器等?)
答案 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.lookupByName
为conn._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