问题描述:我也是在读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. Java实现随意切换VPN改变上网地区

    http://www.jb51.net/article/69267.htm 这篇文章主要介绍了Java实现随意切换VPN改变上网地区,本文直接给出实例代码,需要的朋友可以参考下 在很多情况下,有些网络 ...

  2. vr & obv

    买卖信号 1.当VR曲线的运行形态一底比一底低,而OBV曲线的运行形态一底比一底高,同时股价也突破中短期均线,则表明VR指标和OBV出现了底背离走势,这是VR指标发出的短线买入信号.如图(15–1)所 ...

  3. call_create_syn.sql

    promptprompt ================================================================================prompt ...

  4. 利用hibernate实现oracle(每张表的ID)自动增长

    设置ID的增长策略是sequence,同时指定sequence的名字,最好每个表建一个sequence 例如创建一个序列:CREATE SEQUENCE DEPARTMENT_ID_SEQ MINVA ...

  5. C#对象序列化笔记

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.R ...

  6. 004-Python字符串

    Python 字符串(str) 字符串是 Python 中最常用的数据类型.我们可以使用引号('或")来创建字符串.创建字符串很简单,只要为变量分配一个值即可. var1 = "H ...

  7. Java之Property类使用

    http://blog.csdn.net/hopestar2/article/details/6372883 在项目中经常用到各种配置文件,有.properties的,也有.xml格式的 都可以通过j ...

  8. Eclipse 配置工程

    Eclipse改UTF-8 Window->Preferences->General->Workspace->Text file Encoding Eclipse配置tomca ...

  9. RMQ问题再临

    RMQ问题再临 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 终于,小Hi和小Ho踏上了回国的旅程.在飞机上,望着采购来的特产——小Hi陷入了沉思:还记得在上上周他们去 ...

  10. angular中控制器之间的通讯方式

    1, 利用作用域的继承方式 由于作用域的继承是基于js的原型继承方式,所以这里分为两种情况,当作用域上面的值为基本类型的时候,修改父作用域上面的值会 影响到子作用域,反之,修改子作用域只会影响子作用域 ...