python高级编程之超类02:super的缺陷
# -*- coding: utf-8 -*-
# python:2.x
__author__ = 'Administrator'
#当使用多重继承层次结构时,再使用super的时候是非常危险的,主要是因为类的初始化,基类不在__init__中被隐式调用
#1滥用super和传统调用
#来自james knight(http://funm.net/super-harmful)示例中,类C使用__init__方法调用其基类,这样类B被调用2次
class A(object):
def __init__(self):
print 'A'
super(A,self).__init__()
class B(object):
def __init__(self):
print 'B'
super(B,self).__init__()
class C(A,B):
def __init__(self):
print 'C'
A.__init__(self)
B.__init__(self)
print 'MRO:',[x.__name__ for x in C.__mro__]#MRO: ['C', 'A', 'B', 'object']
C()
"""
C
A
B
B
------------
出现这样的情况是:C实例调用 了A.__init__(self),因而super(A,self).__init__()将调用B构造程序,换句话说,super应该被乃至整个类层次中
问题是有时候这样的层次结构一部分位于第三方代码中,许多由多重继承引入层次调用相关缺陷都可以在JAMES页面上找到,为了避免这样问题,应该问题是在
子类化之前看看__mro__特性,如果它不存在,处理就是一个旧式类,避免使用super可能更安全一些
如下:
"""
from SimpleHTTPServer import SimpleHTTPRequestHandler
#print SimpleHTTPRequestHandler.__mro__AttributeError: class SimpleHTTPRequestHandler has no attribute '__mro__'
"""
如果__mro__存在,则快速地看看每个mro所涉及的类的构造程序代码,如果到处都使用super,那非常好,也可以使用它,否则就试着保持一致性
collections.deque能够被安全地子类化,就可以使用super,因为它直接子类化了object
"""
from collections import deque
print deque.__mro__#(<type 'collections.deque'>, <type 'object'>)
#randeom.Random是一个存在于_random模块中另一个类封装器
from random import Random
print Random.__mro__#(<class 'random.Random'>, <type '_random.Random'>, <type 'object'>)
#Zope类,
"""
from zope.app.container.brower.adding import Adding as s
s.__mro__
官方:http://www.zope.com/
有兴趣的朋友可以浏览下
"""
#不同种类参数
#super用法另一个问题是初始化中参数传递,类在没有相同签名的情况下怎么调用其基类的__init__代码呢?
class Bases(object):
def __init__(self):
print 'bases'
super(Bases,self).__init__()
class B(Bases):
def __init__(self):
print 'B'
super(B,self).__init__()
class B1(Bases):
def __init__(self):
print 'b1'
super(B1,self).__init__()
class MyClass(B,B1):
def __init__(self,arg):
print 'my class arg'
super(MyClass,self).__init__(arg)
#m=MyClass(10)TypeError: __init__() takes exactly 1 argument (2 given)
#解决方法之下是使用*args,**kw魔法,所有构造程序将传递所有参数,即使不使用它们
class Bb(object):
def __init__(self,*args,**kw):
print 'b1'
super(Bb,self).__init__(*args,**kw)
class bb(Bb):
def __init__(self,*args,**kw):
print 'bb'
super(bb,self).__init__(*args,**kw)
class bbb(Bb):
def __init__(self,*args,**kw):
print 'bbb'
super(bbb,self).__init__(*args,**kw)
class MyclSS(bb,bbb):
def __init__(self,arg):
print 'myclss'
super(MyclSS,self).__init__(arg)
mm=MyclSS(10)
"""
myclss
bb
bbb
b1
"""
"""
但是这样是一个很糟糕的修复方法,因为它使所有构造程序将接受任何类型参数,导致代码变得很脆弱,因为任何参数被传递并且通过,另一种解决方法是在yclSS
中使用经典的__init__调用,但是这将会导致产生第一种缺陷
"""
python高级编程之超类02:super的缺陷的更多相关文章
- python高级编程:有用的设计模式1
# -*- coding: utf-8 -*-__author__ = 'Administrator'#python高级编程:有用的设计模式#设计械是可复用的,某种程序上它对软件设计中觉问题提供的语言 ...
- python高级编程之列表推导式
1. 一个简单的例子 在Python中,如果我们想修改列表中所有元素的值,可以使用 for 循环语句来实现. 例如,将一个列表中的每个元素都替换为它的平方: >>> L = [1, ...
- 第三章:Python高级编程-深入类和对象
第三章:Python高级编程-深入类和对象 Python3高级核心技术97讲 笔记 3.1 鸭子类型和多态 """ 当看到一直鸟走起来像鸭子.游泳起来像鸭子.叫起来像鸭子 ...
- 第十章:Python高级编程-多线程、多进程和线程池编程
第十章:Python高级编程-多线程.多进程和线程池编程 Python3高级核心技术97讲 笔记 目录 第十章:Python高级编程-多线程.多进程和线程池编程 10.1 Python中的GIL 10 ...
- python高级编程:有用的设计模式3
# -*- coding: utf-8 -*-__author__ = 'Administrator'#python高级编程:有用的设计模式#访问者:有助于将算法从数据结构中分离出来"&qu ...
- python高级编程:有用的设计模式2
# -*- coding: utf-8 -*- __author__ = 'Administrator' #python高级编程:有用的设计模式 #代理 """ 代理对一 ...
- python高级编程技巧
由python高级编程处学习 http://blog.sina.com.cn/s/blog_a89e19440101fb28.html Python列表解析语法[]和生成 器()语法类似 [expr ...
- python高级编程之选择好名称:完
由于时间关系,python高级编程不在放在这边进行学习了,如果需要的朋友可以看下面的网盘进行下载 # # -*- coding: utf-8 -*- # # python:2.x # __author ...
- python高级编程读书笔记(一)
python高级编程读书笔记(一) python 高级编程读书笔记,记录一下基础和高级用法 python2和python3兼容处理 使用sys模块使程序python2和python3兼容 import ...
随机推荐
- MVC 控制器详解
Controller: Controllers 文件夹包含负责处理用户输入和响应的控制器类. MVC 要求所有控制器的名称必须以 "Controller" 结尾. 控制器的职责: ...
- socket用法以及tomcat静态动态页面的加载
一.套接字的使用: 分为以下几步: 1.创建ServerSocket 2.接收客户端的连接 3.读取本地的test.html文件 4.构建数据输出通道 5.发送数据 6.关闭资源 代码参考: pack ...
- iOS 部分问题总结2 - 苹果审核篇
iOS 部分问题总结(二) - 苹果审核篇 1. 记录下5.1新规后上传被拒的问题排查和解决过程. 几天前,最新一次的更新被拒了,提示Invaild Binary.好在苹果同时发来了说明邮件做了详细说 ...
- mysql下用户和密码生成管理
应用上线,涉及到用户名和密码管理,随着上线应用的增加,用户名和密码的管理设置成为一个问题.还要对用户赋权,于是想着写一个脚本来管理,看到同事写的一个脚本,满足需求.思路大致是字母替换为数字,账号根据库 ...
- openssl 非对称加密算法RSA命令详解
1.非对称加密算法概述 非对称加密算法也称公开密钥算法,其解决了对称加密算法密钥分配的问题,非对称加密算法基本特点如下: 1.加密密钥和解密密钥不同 2.密钥对中的一个密钥可以公开 3.根据公开密钥很 ...
- ASP.NET入门 - 错误和异常处理
当发生错误时,应该向用户提供一个友好的界面,可以屏蔽详细技术信息,也有助提升用户体验,这时就用到了异常处理. 错误类型: 语法错误:因缺少关键字,符号,或其他不正确代码所产生的错误,无法通过编译. 逻 ...
- (转).net开发者对android开发一周的学习体会
春节期间,相对比较闲,上班时也没什么事情做.利用这一周的时间,简单的学习了一下移动方面的开发.主要是针对android,其实我对IOS更感兴趣 (因为我用iphone),苦于暂时没有苹果电脑,只能把它 ...
- dispatch_async 与 dispatch_get_global_queue 的使用方法
GCD (Grand Central Dispatch) 是Apple公司开发的一种技术,它旨在优化多核环境中的并发操作并取代传统多线程的编程模式. 在Mac OS X 10.6和IOS 4.0之后开 ...
- 在Eclipse中运行Nutch2.3
参考http://wiki.apache.org/nutch/RunNutchInEclipse 一.环境准备 1.下载nutch2.3源代码 wget http://mirror.bit.edu.c ...
- 【Nutch2.3基础教程】集成Nutch/Hadoop/Hbase/Solr构建搜索引擎:安装及运行【集群环境】
1.下载相关软件,并解压 版本号如下: (1)apache-nutch-2.3 (2) hadoop-1.2.1 (3)hbase-0.92.1 (4)solr-4.9.0 并解压至/opt/jedi ...