如何在python中覆盖方法?

时间:2016-06-04 02:52:48

标签: python python-3.x overwrite

我有一点困境,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);
            }
          }
        }
      }
    });

  });


});

2 个答案:

答案 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!

值得指出的是,classBclassC类似乎毫无意义,因为它们(如图所示)对基类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。