问题描述:我也是在读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() 有返回值,所以无法在父类中仅仅的定义一个空函数,不然要报错
 

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用起来虽然爽,一旦工程规模大了,迟早会留坑

(原文地址:https://www.v2ex.com/t/125569)

[转python 父类可以调用子类的方法的更多相关文章

  1. Java 中父类怎么调用子类的方法?

    父类能调用子类的方法吗? 答:能. 怎么做? ● 把子类传递到父类的有参构造中,然后调用. ● 使用反射的方式调用,你使用了反射还有谁不能调用的?! ● 父类调用子类的静态方法. 案例展示: pack ...

  2. Java父类对象调用子类实体:方法重写与动态调用

    众所周知Java的handle和C++的ponter而不是object对应,我们很熟悉C++的父类pointer调用子类实体的例子,那么对于Java的handle是不是也可以这样呢? 这里我先给一个例 ...

  3. Javascript:父类可以调用子类吗?

    问:父类可以调用子类吗? 答:可以,经典的模板方法模式就是用的这个特性.

  4. Java 构造器 一道构造器调用子类重载方法的题目

    构造器中不能new本类对象,否则进入死循环. 构造器没有返回值,也没有void修饰. 使用关键字super可以调用父类的构造器,而且这一句必须放在第一句的位置,否则无法编译. 题目: 请写出以下程序的 ...

  5. 拥有iframe页面的子父类窗口调用JS的方法,并且注意的事项

    一.前言 我页面用的是EasyUI的弹出窗口里面嵌入一个iframe.第一:父窗口打开子窗口是一个新增用户信息的iframe子页面,点击保存后,子窗口iframe则去调用父窗口的function cl ...

  6. java this 子类调父类,父类再调用子类已覆盖的方法及属性(又一次理解)

    之前一直以为 this关键字 是指调用者对象,但是这次才真正理解,this代表当前对象,但是指向调用者对象,其实就是多态的用法,如下所示:B 继承了 A,在B 中调用A类的方法,在A 中用this 访 ...

  7. java 集合 父类的使用子类的方法时候 底层自动转型为子类的数据类型

    跟继承多态不一样 继承多态需要显示转型

  8. php 父类调用子类方法和成员

    在C和C++里,父类都不允许调用子类的方法,但在php里可以.下面是一个调用的例子: <?php abstract class Animal { protected $name; public ...

  9. PHP面向对象-看父类调用子类方法

    大部分面向对象编程语言中,父类是不允许调用子类的方法的,但是PHP中可以 1.父类调用子类方法示例 class A { public function testa() { $this->test ...

随机推荐

  1. 第19章 网络通信----TCP程序设计基础

    TCP网络程序设计是指利用Socket类编写通信程序.利用TCP协议进行通信的两个应用程序是有主次之分的,一个称为服务器程序,另一个称为客户机程序,两者的功能和编写方法大不一样. 1.InetAddr ...

  2. WiresShark 一站式学习

    按照国际惯例,从最基本的说起. 抓取报文: 下载和安装好Wireshark之后,启动Wireshark并且在接口列表中选择接口名,然后开始在此接口上抓包.例如,如果想要在无线网络上抓取流量,点击无线接 ...

  3. Android MediaScanner 详尽分析

    [Innost]: http://blog.csdn.net/Innost/article/details/6083467 ====================================== ...

  4. Ubuntu防火墙ufw安装配置

    ubuntu 系统默认已安装ufw. 1.安装sudo apt-get install ufw2.启用sudo ufw enablesudo ufw default deny运行以上两条命令后,开启了 ...

  5. HDU 1213 How Many Tables 并查集 寻找不同集合的个数

    题目大意:有n个人 m行数据,每行数据给出两个数A B,代表A-B认识,如果A-B B-C认识则A-C认识,认识的人可以做一个桌子,问最少需要多少个桌子. 题目思路:利用并查集对相互认识的人进行集合的 ...

  6. 自定义View常处理的回调函数

    自定义View常处理的回调函数 onFinishInflate() 当View中所有的子控件均被映射成xml后触发 onMeasure(int, int) 确定所有子元素的大小 onLayout(bo ...

  7. 转:web_reg_save_param的使用详解

    [摘要]利用实际案例说明如何使用Mercury LoadRunner提取包含在 HTML 页内的动态信息并创建参数. [关键词]性能测试,压力测试,Mercury LoadRunner 应用范围 在使 ...

  8. 给ThinkPHP5增加验证码功能

    就在这几天,TP5进行的RC3的大规模更新,虽然我们都狠狠地骂了一百遍,但是我的内心是无比的激动,TP终于走上了"上流社会"的模式:composer! 为什么说composer是上 ...

  9. CSS之基础

    css是英文Cascading Style Sheets的缩写,称为层叠样式表,用于对页面进行美化.存在方式有三种:元素内联.页面嵌入和外部引入,比较三种方式对优缺点. 语法:style = &quo ...

  10. codeforce 611C New Year and Domino

    n*n预处理. 询问的时候用容斥,再删除边界. #include<cstdio> #include<cstring> #include<cmath> #includ ...