我有一点困境,classC
我需要在课程functionA
上调用,但在我这样做之前,我需要覆盖#fileA
class classA():
def functionA():
print('Hello World!')
class classB(classA):
pass
class classC(classB):
pass
#fileB
from fileA import classC
#overwrite functionA
classC()
。我不知道该怎么做。谢谢你提前帮忙!
$(function() {
var autocomplete;
var geocoder;
var input = document.getElementById('location');
var options = {
componentRestrictions: {
'country': 'us'
},
types: ['(regions)'] // (cities)
};
autocomplete = new google.maps.places.Autocomplete(input, options);
$('#go').click(function() {
var location = autocomplete.getPlace();
geocoder = new google.maps.Geocoder();
console.log(location['geometry'])
lat = location['geometry']['location']['J'];
lng = location['geometry']['location']['M'];
var latlng = new google.maps.LatLng(lat, lng);
// http://stackoverflow.com/a/5341468
geocoder.geocode({
'latLng': latlng
}, function(results) {
for (i = 0; i < results.length; i++) {
for (var j = 0; j < results[i].address_components.length; j++) {
for (var k = 0; k < results[i].address_components[j].types.length; k++) {
if (results[i].address_components[j].types[k] == "postal_code") {
zipcode = results[i].address_components[j].short_name;
$('span.zip').html(zipcode);
}
}
}
}
});
});
});
答案 0 :(得分:3)
执行所需操作的“正确”方法是覆盖方法,而不是覆盖它。您可以通过创建类的子类并为其一个或多个方法提供新定义来实现。
首先,虽然classA.functionA()
的定义中存在错误 - 但您需要包含self
参数:
class classA:
def functionA(self):
print('Hello World!')
在更正后,您需要在classC
中定义fileB.py
的新子类,该子类覆盖functionA()
:
from fileA import classC
class classD(classC):
def functionA(self):
print('classD.functionA(): Hello World!')
>>> c = classC()
>>> c.functionA()
Hello World!
>>> d = classD()
>>> d.functionA()
classD.functionA(): Hello World!
值得指出的是,classB
和classC
类似乎毫无意义,因为它们(如图所示)对基类A
没有任何更改。所以你可以直接继承classA
。
这是最基本的面向对象设计/编程,因此我建议您查看一两个教程。
正如我上面所说,这是正确的方法。你也可以替换/覆盖这样的方法:
from fileA import classC
def my_function_A(self):
print('my_function_A(): Hello World!')
>>> c = classC()
>>> c.functionA()
Hello World!
>>> classC.functionA = my_function_A # overwrite the method
>>> classC().functionA()
my_function_A(): Hello World!
>>> c.functionA()
my_function_A(): Hello World!
但是覆盖比覆盖它更可取。一个问题是,如果您覆盖该方法,任何预先存在的classC
实例也将受到影响,如上面代码的最后一行所示。
答案 1 :(得分:0)
您正在寻找的技术名称是monkeypatching。
Python中的函数是一流的对象。因此,您可以简单地将它们分配给类或对象。这意味着您可以拥有两个对象,这两个对象是同一个类的实例,即使调用了相同的名称,也会调用两个不同的方法。它们甚至不必定义相同的名称甚至任何名称;我在看着你,Lambda。