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. 转:Natas Wargame Level28 Writeup(EBC加密破解)

    From:http://alkalinesecurity.com/blog/ctf-writeups/natas-28-getting-it-wrong/ Now that I knew it was ...

  2. java String,StringBuffer和StringBulder学习笔记

    1.String:不可改变的Unicode字符序列. 池化思想,把需要共享的数据放在池中,用一个存储区域来存放一些公用资源以减少存储空间的开销. 在String类中,以字面值创建时,回到java方法空 ...

  3. Intellij IDEA 4种配置热部署的方法

    热部署可以使的修改代码后,无须重启服务器,就可以加载更改的代码. 第1种:修改服务器配置,使得IDEA窗口失去焦点时,更新类和资源 菜单Run -> EditConfiguration , 然后 ...

  4. shell编写mysql抽取数据脚本

    #!/bin/bash DT=`date +%Y%m%d` #当前日期YESTERDAY=`date -d "yesterday" +%Y-%m-%d` #昨天,用于处理数据的日期 ...

  5. Python 项目实践一(外星人入侵小游戏)第五篇

    接着上节的继续学习,在本章中,我们将结束游戏<外星人入侵>的开发.我们将添加一个Play按钮,用于根据需要启动游戏以及在游戏结束后重启游戏.我们还将修改这个游戏,使其在玩家的等级提高时加快 ...

  6. 【python】字符串变量赋值时字符串可用单或双引号

    >>> name='萧峰' >>> print(name) 萧峰 >>> name="独孤求败" >>> p ...

  7. NFV、DPDK以及部分用户态协议研究

    本文为作者原创,转载请注明出处(http://www.cnblogs.com/mar-q/)by 负赑屃 对我而言,这是一个新的领域,很有意思. 一.解释名词: NFV(Network Functio ...

  8. 创建、设置和安装Windows服务

    文章大部分内容转自:http://www.cnblogs.com/greatandforever/archive/2008/10/14/1310504.html:和:http://www.cnblog ...

  9. [array] leetcode - 53. Maximum Subarray - Easy

    leetcode - 53. Maximum Subarray - Easy descrition Find the contiguous subarray within an array (cont ...

  10. [置顶] MVC输出缓存(OutputCache参数详解)

    1.学习之前你应该知道这些 几乎每个项目都会用到缓存,这是必然的.以前在学校时做的网站基本上的一个标准就是1.搞定增删改查2.页面做的不要太差3.能运行(ps真的有这种情况,答辩验收的时候几个人在讲台 ...