[转python 父类可以调用子类的方法
2017-01-15 22:17
465 查看
问题描述:我也是在读500 Line 里满的DBDB 的代码时发现的,python的父类可以调用子类的方法,这跟平常习惯的理解方式很不一样,所以就查了下原因,记录如下:
1、现象:
最近使用到了SocketServer.py 这个包,就顺便学习一下它的实现,在阅读的过程中,发现
BaseServer 中的 _handle_request_noblock()函数中 有一句
request, client_address = self.get_request()
而这个 get_request()方法是在继承于BaseServer的 TCPServer 和UDPServer 中实现的,
三个的关系的定义是:
class BaseServer:
class TCPServer(BaseServer):
class UDPServer(TCPServer):
2、疑问:
父类可以调用子类中的方法么?
还是说我对这里代码的理解有误?
希望明白的朋友给我解一下惑或者指引一下相关的资料,谢谢拉!
第 1 条附言 · 2014-08-01 11:51:06 +08:00
多谢 @clino 的解释
这里的设计是不是不好,应该在BaseServer中定义一个
def get_requeset(self):
pass
然后再在去子类中改写?让结构更清晰一些?
第 2 条附言 · 2014-08-01 14:00:14 +08:00
哦,因为 get_request() 有返回值,所以无法在父类中仅仅的定义一个空函数,不然要报错
tcpserver
baseserver
udpserver
9 回复 | 直到 2014-08-02 00:06:58 +08:00
(原文地址:https://www.v2ex.com/t/125569)
1、现象:
最近使用到了SocketServer.py 这个包,就顺便学习一下它的实现,在阅读的过程中,发现
BaseServer 中的 _handle_request_noblock()函数中 有一句
request, client_address = self.get_request()
而这个 get_request()方法是在继承于BaseServer的 TCPServer 和UDPServer 中实现的,
三个的关系的定义是:
class BaseServer:
class TCPServer(BaseServer):
class UDPServer(TCPServer):
2、疑问:
父类可以调用子类中的方法么?
还是说我对这里代码的理解有误?
希望明白的朋友给我解一下惑或者指引一下相关的资料,谢谢拉!
第 1 条附言 · 2014-08-01 11:51:06 +08:00
多谢 @clino 的解释
这里的设计是不是不好,应该在BaseServer中定义一个
def get_requeset(self):
pass
然后再在去子类中改写?让结构更清晰一些?
第 2 条附言 · 2014-08-01 14:00:14 +08:00
哦,因为 get_request() 有返回值,所以无法在父类中仅仅的定义一个空函数,不然要报错
tcpserver
baseserver
udpserver
9 回复 | 直到 2014-08-02 00:06:58 +08:00
1 clino 2014-08-01 11:00:18 +08:00 ♥ 1 不用从"父类可以调用子类中的方法"这种角度去看,而从对象生成以后的执行调用这个角度去看就行了,对象调用的时候 self.get_request() 就是调用自己这个对象里的 get_request() 方法啊,那这个方法具体是哪个,是由对象是从哪个类产生决定的 |
2 datou552211 2014-08-01 11:04:57 +08:00 ♥ 1 这里的self不是指BaseServer或者它的实例。 |
3 leyle 2014-08-01 11:13:20 +08:00 @clino 多谢,一下子就明白了。 |
4 julyclyde 2014-08-01 16:40:17 +08:00 无所谓啊反正是执行的时候才执行的,而不是编译期 |
5 x10ng 2014-08-01 16:48:30 +08:00 动态类型就是这样子,只要运行期的对象有该方法就可以。 |
6 maemual 2014-08-01 17:05:53 +08:00 第二条附言不对吧,就算声明了这个方法,就pass一下,也不会报错啊。 都说了python是动态类型,只需要在运行时有这个方法,也就是继承的TCPServer、UDPServer有这个方法的正确实现就行了。 这里的设计是不是不好的问题,确实不怎么好说。在我的理解,这里的BaseServer不是用来给用户使用的,Python的文档里也没有提到这个东西,所以默认他写这个基类是给自己方便下面实现TCPServer和UDPServer用的。所以只要他自己去实现对应的方法就行了。 同样,在Tornado 4.0的源码里,有很多地方的基类,比如tcpserver.py里214行声明了handle_stream,在255行调用了,但是只是简单的raise NotImplementedError()。本人是觉得Tornado的这种方式更加好一些。 |
7 kamushin 2014-08-01 17:14:48 +08:00 @maemual 同意这位。在看Tornado代码的时候我也发现了这种raise NotImplementedError()的做法,我觉得这样会比较好。 |
8 shyrock 2014-08-01 18:04:58 +08:00 声明同名空方法的方式更符合静态语言的思想。 从代码的可读性来说,这个方法对习惯静态语言的开发者更友好。 |
9 incompatible 2014-08-02 00:06:58 +08:00 赞同 @maemual 的方式和 @shyrock 的观点 刚刚转python的java码农表示:dynamic binding用起来虽然爽,一旦工程规模大了,迟早会留坑 |
相关文章推荐
- Python实现子类调用父类的方法
- Python 子类调用父类方法
- python子类调用父类的方法
- Python 子类调用父类的方法
- python中子类调用父类构造方法
- python中子类调用父类的初始化方法
- python基础----继承与派生、组合、接口与归一化设计、抽象类、子类中调用父类方法
- python基础之类的继承与派生、组合、接口与归一化设计、抽象类、子类中调用父类方法
- python子类调用父类的方法
- Python 子类调用父类方法
- Python学习笔记--子类调用父类方法
- python子类调用父类的方法-super
- Python开发基础-Day20继承实现原理、子类调用父类的方法、封装
- 子类中方法与父类中形成重写关系,可以在构造方法中用super来调用父类中的该方法
- python学习笔记:子类怎样调用父类方法
- python子类如何调用父类的__init__方法
- Python实现子类调用父类的方法
- 【java】子类可以通过调用父类的public方法调用父类的private方法,为什么?
- Python 父类调用子类方法的问题
- Python 在子类中调用父类方法详解(单继承、多层继承、多重继承)