问题描述:我也是在读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. svn log操作

    查看当前文件夹的最近N次提交记录 svn update; svn log --limit <N> -v 含义是:查询最近N次提交记录的详细信息,包括版本号,提交文件列表,log信息 对比某 ...

  2. jQuery validation

    之前做客户端验证感觉自己javascript 不行,虽然能写出来一完整的验证,但从不自信,一直觉得客户端验证是比较繁琐的事情,但是又不能不做,只到最开始接触ajax ,遇到了一个jQuery vali ...

  3. 用Eclipse 统计代码行数小技巧

    今天公司SQA问我目前项目代码行数有多少,我当时就是想,以前好像写过类似的统计工具但是一时又找不到 公司网络又不能下载,所以想想eclipse是不是又类似功能,找了下没有,但突然一想有一个转弯方法:统 ...

  4. 转 android学习—— context 和 getApplicationContext()

    在android中常常会遇到与context有关的内容 浅论一下context : 在语句 AlertDialog.Builder builder = new AlertDialog.Builder( ...

  5. angularJS 系列(五)--controller AS 语法

    原文: http://www.cnblogs.com/whitewolf/p/3493362.html 这篇国外的文章也非常好: http://codetunnel.io/angularjs-cont ...

  6. OpenGL学习--------颜色的选择

    OpenGL支持两种颜色模式:一种是RGBA,一种是颜色索引模式.无论哪种颜色模式,计算机都必须为每一个像素保存一些数据.不同的是,RGBA模式中,数据直接就代表了颜色:而颜色索引模式中,数据代表的是 ...

  7. android UI中添加一张图片如何将这张图片中某一部分设为透明的

    可以利用canvas画布类,这个类的具体方法可以参看官方api.http://developer.android.com/reference/android/graphics/Canvas.html ...

  8. Android CTS 测试总结【转】

    Android CTS 测试总结[转] 最近一直在做Android兼容性测试,根据Android官网给出的android-cts-manual 配置好了device后,开始测试. 首先配置软件环境: ...

  9. Arduino IDE 添加DHT11传感器第三方库的方法

    由于Arduino本身没有DHT 11温湿度传感器的的头文件,单有第三方的库可以给我门使用.方法如下: Step 1:如果你已经下载了最新版的Arduino IDE就可以使用其自带的库管理器和版型管理 ...

  10. Chapter 1 First Sight——2

    "Bella," my mom said to me — the last of a thousand times — before I got on the plane. &qu ...