1、背景:

近日切换到python3后,发现python3在多态处理上,有一些比较有意思的情况,特别记载,供大家参考。。。

以廖老师的python3教程中的animal 和dog的继承一节的代码做例子,上代码先:

#!/usr/bin/env python3
# -*- coding: utf-8 -*- class Animal(object):
def run1(self):
print('Animal is running 1...')
def run2(self):
self.run1()
print('Animal is running 2...') class Cat(Animal):
def run1(self,name):
print('[%s] Cat is running1...' %name) def run2(self,name=""):
super().run2()
print('[%s] cat is running2...' %name) def run_twice(animal):
animal.run1("")
animal.run2("") if __name__=='__main__':
c = Cat()
run_twice(c)

输出结果:

[1] Cat is running1...

报错信息如下:

 File "d:\python\tensf\clstest.py", line 28, in <module>
run_twice(c)
 File "d:\python\tensf\clstest.py", line 23, in run_twice
animal.run2("")
 File "d:\python\tensf\clstest.py", line 17, in run2
super().run2()
 File "d:\python\tensf\clstest.py", line 8, in run2
self.run1() builtins.TypeError: run1() missing 1 required positional argument: 'name'

2、分析原因:

1、父类animal中run2()调用了run1()

2、子类cat中覆盖了run1(),增加了name参数,并覆盖了run2(),同样增加了name参数,并调用父类animal中run2()

3、理想中的状态,父类的run2()应该是调用父类的run1(),实际却是调用子类的run1(),所以导致参数匹配错误。

builtins.TypeError: run1() missing 1 required positional argument: 'name'

解决方案要分情况,就本例而言给name赋上默认值即可。

3、延伸

问题来源于自己写了configparser的扩展包,实现给get(),getint(),set()加默认值的方法,在python2中好用,移到python3中突然不好用了,有点发懵。

不过仔细分析,还是python3中configparser的get()有修改。

困扰了我接近一天,还是基本功有问题,贴上我写的简单代码。

补充一点:python3下默认有configparser,无需额外用pip安装,而且大写改成了小写。

#coding=utf-8
'''
Date :2016.10.8
Author : joshua zou Purpose :
configparser 的扩展类,增加默认值,兼容key不存在的情况。
Use exap:
import eConfig as eTax
INICONFIG=eTax.eConfig()
#读取配置文件中配置
debuglevel = INICONFIG.get('default','debuglevel')
'''
try:
from configparser import OrderedDict as _default_dict
except ImportError:
# fallback for setup.py which hasn't yet built _collections
_default_dict = dict from configparser import RawConfigParser class eConfig(RawConfigParser ):
def __init__(self, defaults=None, dict_type=_default_dict,
allow_no_value=False):
super().__init__(defaults, dict_type,allow_no_value) def get(self, section, option, default='',**kwargs):
try :
sRet = super().get(section, option,**kwargs)
except:
sRet = default
return sRet def getint(self, section, option,default=None,**kwargs):
try :
sRet = super().getint(section, option,**kwargs)
except Exception as e :
sRet = default
return sRet def getfloat(self, section, option,default=None,**kwargs):
try :
sRet = super().getfloat(section, option)
except:
sRet = default
return sRet def getboolean(self, section, option,default=None,**kwargs):
try :
sRet = super().getboolean(section, option)
except:
sRet = default
return sRet def set(self, section, option,value):
if not super().has_section(section):
sRet = super().add_section(section)
sRet = super().set(section, option, value)
return sRet if __name__ == "__main__":
#读取配置
filename = r'zhbook.ini'
sf=eConfig()
sf.read(filename) print (sf.get('name', 'lastchp',''))
print (sf.getint('name', 'lastchp',0))
print (sf.get('default', 'taskcount1', ''))
print (sf.get('default', 'taskcount1'))
print (sf.getint('default', 'taskcount1'))
print (sf.getboolean('default', 'taskcount1'))
print (sf.getfloat('default', 'taskcount1'))
print (sf.set('default2', 'taskcount1',u'')) #保存配置
fp = open(filename,"w")
sf.write(fp)
fp.close()
print (sf.get('default', 'taskcount1'))
sf.remove_option('default','taskcount1')
fp = open(filename,"w")
sf.write(fp)
fp.close()

论python3下“多态”与“继承”中坑的更多相关文章

  1. 四. Java继承和多态3. 继承中的方法的覆盖和重载

    在类继承中,子类可以修改从父类继承来的方法,也就是说子类能创建一个与父类方法有不同功能的方法,但具有相同的名称.返回值类型.参数列表. 如果在新类中定义一个方法,其名称.返回值类型和参数列表正好与父类 ...

  2. 从认识面向对象到构造函数的标准写法(构造函数的继承、多态、ECMA6中新代替语法class) - 下

    笔记一个包含:认识面向对象.构造函数的封装.继承.多态.ECMA6中新代替语法class 下:包括构造函数的继承.多态.ECMA6中新代替语法class 构造函数的继承 从父一级延续下来的属性和功能( ...

  3. 1-Java继承中多态情况特性下变量,方法,静态方法的访问

    在Java继承下,多态特性下类成员访问情况 /* 在继承中,变量时静态的绑定的,非静态方法是动态的绑定的,静态方法是静态绑定的 */ class Parent{ int number = 11; pu ...

  4. python3下安装aiohttp遇到过的那些坑

    python3下安装aiohttp遇到过的那些坑 最近需要用到aiohttp这个库,在安装过程中遇到很多坑.google.baidu后,依然没有找到合适的解决方案. 后来通过去python官方的PyP ...

  5. java基础课程笔记 static 主函数 静态工具类 classpath java文档注释 静态代码块 对象初始化过程 设计模式 继承 子父类中的函数 继承中的构造函数 对象转型 多态 封装 抽象类 final 接口 包 jar包

    Static那些事儿 Static关键字 被static修饰的变量成为静态变量(类变量) 作用:是一个修饰符,用于修饰成员(成员变量,成员方法) 1.被static修饰后的成员变量只有一份 2.当成员 ...

  6. Linux下Python3.6的安装及避坑指南

    Python3的安装 1.安装依赖环境 Python3在安装的过程中可能会用到各种依赖库,所以在正式安装Python3之前,需要将这些依赖库先行安装好. yum -y install zlib-dev ...

  7. Java多态机制和继承中重写重载

    关于Java中多态机制 http://www.cnblogs.com/chenssy/p/3372798.html 这篇博文讲的很透彻 大体意思是 多态定义: 多态就是指程序中定义的引用变量所指向的具 ...

  8. 继承中的隐藏(hide)重写(Override)和多态(Polymorphism)

    继承中的隐藏:(不要使用隐藏,语法没有错误但是开发项目时会被视为错误) 在继承类中完全保留基类中的函数名 //基类,交通工具 class Vehicle { public void Run() { C ...

  9. 深入理解OOP(三):多态和继承(动态绑定和运行时多态)

    在前面的文章中,我们介绍了编译期多态.params关键字.实例化.base关键字等.本节我们来关注另外一种多态:运行时多态, 运行时多态也叫迟绑定. 深入理解OOP(一):多态和继承(初期绑定和编译时 ...

随机推荐

  1. SSH简单项目

    这是我学习SSH整合时的一个测试项目,代码比较简单 整个项目实现从数据库中取数据,在页面上显示.项目的结构如下: (1)数据库设计 数据库使用的是student数据库中的一个数据库表grade,表的内 ...

  2. 小白的Python之路 if __name__ == '__main__' 解析

    if __name__ == '__main__' 参考文献: http://www.cnblogs.com/xuxm2007/archive/2010/08/04/1792463.html http ...

  3. [译文]React v16(新特性)

    [译文]React v16(新特性) 查看原文内容 我们很高兴的宣布React v16.0发布了! 这个版本有很多长期被使用者期待的功能,包括: fragments (返回片段类型) error bo ...

  4. 完善chrome翻译插件ChaZD,支持有道智云api

    首先放上该项目的github地址:https://github.com/codethereforam/ChaZD 之前想找一个chrome支持划词翻译的插件,最终在知乎上看到了这个回答,推荐的是Cha ...

  5. Jenkins 关闭和重启实现方式.

    1.关闭Jenkins 只需要在访问jenkins服务器的网址url地址后加上exit.例如我jenkins的地址http://localhost:8080/,那么我只需要在浏览器地址栏上敲下http ...

  6. 一道叉姐的AC自动机鬼题

    题面描述丢失了... 给n个串模板串,然后再给你m个串,对于这m个串的每个串,问在[L,R]的模板串中,在多少个串中出现过; 这题的正解是对于后m个串建AC自动机,然后离线,在fail树上树链求并. ...

  7. 转载|chrome developer tool—— 断点调试篇

    断点,调试器的功能之一,可以让程序中断在需要的地方,从而方便其分析.也可以在一次调试中设置断点,下一次只需让程序自动运行到设置断点位置,便可在上次设置断点的位置中断下来,极大的方便了操作,同时节省了时 ...

  8. lesson - 10 课程笔记

    CTRL+C CTRL+D :前者用于结束一个程序,后者用于结束终端输入. --符号 *:匹配任意长度的任意字符 ?:匹配任意一个字符 #: shell 中表注释 \: 脱意符号 []:任意属于字符组 ...

  9. Python安装和开发环境搭建

    1.官网:http://www.python.org/download/下载安装包,目前最新版本为3.6,安装包很多地方可以下,也可以在360软件管家上下载安装  特别要注意勾选:Add Python ...

  10. JMeter常见错误解决方法

    1.Windows 平台,双击 jmeter/bin 目录下 jmeter.bat 文件,jmeter 无法启动且报错如下: 此问题是没有配置 jdk 环境变量所致,配置好 jdk 环境变量即可. 2 ...