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. SQL Server 全文索引的管理

    全文索引不同于常见的聚集索引或非聚集索引,这些索引的内部实现是平衡树(B-Tree)结构,而全文索引在物理上是由一系列的内部表(Internal tables)构成的,这些内部表称作全文索引片段(Fr ...

  2. .net 裁剪图片(不压缩)

    命名空间: using System.Drawing; using System.Drawing.Imaging; /// <summary> /// 生成图片缩略文件 /// </ ...

  3. 为什么还坚持.NET? 找一门适合自己的语言去做编程

    为什么还坚持.NET? 找一门适合自己的语言去做编程 接触了.NET快十二年了,现在专注于分布式服务的开发. 中间经历过各种编程语言的诱惑,ios等. 前几年才对自己有比较明确的定位 技术上:找到适合 ...

  4. django2.0+linux服务器 ,如何让自己电脑访问

    这几天一直在搞这个服务器端口开放问题,来让自己电脑可以访问服务器下的django网页,今天终于弄好了~~~~~离成功又进了一步~~~~~ 1.首先,我们来开放一个linux服务器的端口(我开放了828 ...

  5. 17089 最大m子段和

    17089 最大m子段和 时间限制:1000MS  内存限制:65535K提交次数:0 通过次数:0 题型: 编程题   语言: G++;GCC;VC Description "最大m子段和 ...

  6. MySQL相关命令

    我们现在初步学习MySQL,下面来简单介绍一下MySQL常用命令 版权归skylinelin所有,转载请注明出处. 首先登录MySQL数据库,"\h"一下看一下帮助信息 这些就是M ...

  7. #ifdef #else #endif #if #ifndef 的用法

    预编译就是在对源文件进行处理之前(如在语法扫描和分析之前),先处理预处理部分,精简代码,然后再进行编译. 预处理命令有:#include 文件包含.#define 宏定义.以及要重点讲的#if.#if ...

  8. [置顶] Xamarin Android安装教程(2016最新亲测安装版)

    写这篇安装教程前要说的几句话 之前很多人想用Vs来开发Android项目,苦于这个环境的安装.的确这并不是一件简单的事情,并不是开发者都能在花一上午能装好,如果你花了一天时间,第一个Xamarin   ...

  9. python net-snmp 的使用

    这一年一直在做一个综合管控平台的项目,用python写的,项目春节前可能就要进行实际部署了和测试,趁着这个空闲期,回顾一下项目中用到的一些技术,第一个就是SNMP协议. 项目结构主要是实现对ipran ...

  10. SSIS 实用表达式部分总结

    下面,列出一些实用的表达式: 1,路径取文件名 RIGHT([FilePath],FINDSTRING(REVERSE([FilePath]),) - ) RIGHT(@[User::FilePath ...