class Person(object): def __init__(self, height): self.height = height def show_height(self): return self.height class Girl(Person): def __init__(self, height, breast): super(Man, self).__init__(height) self.breast = breast p = Person(170) Girl.show_height(p) TypeError: unbound method show_height() must be called with Man instance as first argument (got Person instance instead) 错误很清晰,但是不太明白为什么不能这样调用,反过来却可以。
![]() | 1 sudo987 OP super 里的 Man 改成 Girl ,但这不是重点。 |
![]() | 2 caoyue 2016-06-12 17:50:10 +08:00 我猜楼主是想通过 Girl.show_height(instance) 这样的方式去实现 Girl(170, 36).show_height() 的调用? 如果忽略那个 Man 的问题,也应该使用 p = Girl(170, 36) Girl.show_height(p) 才对 因为 p 并不是 Girl 的 instance ,所以报错不是很正常么 |
3 JhZ7z587cYROBgVQ &nsp;2016-06-12 17:50:32 +08:00 show_height 应该是实例方法,你用 p 作为参数是不对的,然后因为 Girl 继承了 Person ,而你是按 classmethod 的方法在调用 show_height ,所以应该用 Girl 类的实例来调用这个方法 |
4 lujun9972 2016-06-12 18:25:10 +08:00 目测 LZ 用的 python2 ?用 python3 试试 |
![]() | 5 mdzz 2016-06-12 18:28:18 +08:00 g = Girl(170) g.show_height() 难道不是这样用? |
6 tairan2006 2016-06-12 18:31:43 +08:00 你直接用`Girl`调用 method 是闹哪样…又不是 classmethod 或者 staticmethod |
![]() | 7 sudo987 OP @tairan2006 因为方法是类属性,不是实例属性,只是方法需要有实例和它绑定,所以 Girl.show_height(实例),这样调用没有问题。 |
![]() | 9 sudo987 OP @iEverX 嗯,应该和 java 的多态一样( Girl 肯定是一个 Man ,但是 Man 不一定是一个 GIrl ),可我感觉 python 里的多态没啥用, python 不会做类型检查,是这样么? |
10 tairan2006 2016-06-12 20:01:10 +08:00 @sudo987 没听说过这样用的,`self`这个参数就相当于其他语言的`this`,在使用`.`操作符的时候自动就传进去了。 你这里直接传一个实例进去,想手动指定 self ?这不符合语法吧。 |
![]() | 11 iEverX 2016-06-12 20:02:17 +08:00 @sudo987 为啥没用? java 怎么用 python 就怎么用啊。 类型检查应该是没有,因为没有类型声明,不过这里是 method 不是 function ,应该是做了检查的 |
![]() | 12 sudo987 OP @tairan2006 你可以试一下,没听说不代表不可以。 |
![]() | 13 sudo987 OP @tairan2006 ``` p = Person(1111) #实例化 p.show_height()#绑定,同时调用 我感觉 python 的这种“常规写法”是一种快捷方式,真正的方法调用就应该是 Person.show_height(p),因为方法是类属性不是实例属性,调用也应该是用“类.方法名”这样调用(因为方法的定义格式就是这样),然后传入实例进行方法绑定+调用,欢迎拍砖。 ``` |
![]() | 14 sudo987 OP @iEverX java 里是方法的参数比如说声明成父类,然后传入子类的实例,然后调用父类的方法,子类的实例覆盖父类的方法,于是调用父类的方法变成调用传入实例的方法, python 不做参数类型检查,只要是传入的实例有一样的方法名,就可以调用成功,那多态还有什么意义。。。不懂,求教。 |
15 tairan2006 2016-06-12 20:49:14 +08:00 @sudo987 我知道什么意思,但是你这研究的是 python 的实现…我觉得这就跟 C++里面的未定义行为一样,解释器到底怎么处理是不一定的,真要纠结这个问题就看 CPython 源码。 |
![]() | 16 hst001 2016-06-12 23:12:07 +08:00 我没学过 python ,但是看你这逻辑就不对 |
![]() | 19 mulog 2016-06-13 10:56:20 +08:00 If it looks like a duck, swims like a duck, and quacks like a duck, then it probably is a duck. :) |