一个简单的python程序python问题,求教

赶快加入吧
收藏,1.2k 浏览
问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
class DahlBookManager(models.Manager):
def get_query_set(self):
return super(DahlBookManager, self).get_query_set().filter(author='Roald Dahl')
这段自定义模型manager的代码里面 用super(DahlBookManager, self)这样的方式构造一个父类对象为什么要传一个DahlBookManager类名和self引用啊?
DahlBookManager这个作为参数准确的说是一个DahlBookManager的对象吧?
也就是想问这个构造父类对象的super方法中为什么要传入这样两个参数?
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
也许可以认为这是Python设计的缺陷导致的,因为Python 3.0只需要用 super().some_attr 就行了。至于为什么需要两个参数,可以大概分析一下,如果有错,欢迎指正。
先介绍下背景知识:super是从Python 2.2开始随着 new-style class 一起引入的,也只能应用于所谓的 new-style class (即直接或间接继承于 object 的class),可以在一定程度上解决所谓钻石继承的问题。2.2起所有python内置class都是new-style class。
那么super是什么呢?实际上它是一个builtin的type,你调用 super(Base, self) 会返回一个 __class__ = super 的对象,这个对象可以作为一个代理,通过BFS的顺序(实际上列表已经保存在Base.__mro__里了)去访问第一个直接定义了目标属性的基类里的属性。super(type, obj_or_subtype).attr 基本上可以认为是
find_in_mro_provide_by(obj_or_subtype, "attr") ,有点晦涩。
注意,super()返回的不是“父类对象”,而是一个super类型的对象;实例化的时候,第一个参数是一个类型(type),第二个参数可以是type的instance,也可以是type的subclass。这两点题主都理解错了。
介绍完基础知识,可以先说说为什么要有第二个参数。理由很简单 —— 我们知道 self 代表当前对象,每个对象的方法在定义的时候都需要显示地把self作为第一个参数,你本来应该写成这样
some_class.some_method(obj, *args, **kwargs)
但是因为Python语法允许 obj.some_metod(*args, **kwargs) (本质上是个语法糖) ,所以你可以写得简单点(不必显式地给出方法的第一个参数)。而super对象则不同,它没有语法上的直接支持,所以在内部invoke some_method的时候必须指定某个对象,而这个对象的得你自己塞给它,也就是说把这个super对象绑定(bound)到第二个参数上。所以实际上并不是非要用self作为super的第二个参数,甚至super并不是必须在class内部才能调用:
class A(object):
def foo(self):
print self.name
class B(A):
def __init__(self, name):
self.name = name
b1 = B('b1')
super(B, b1).foo() #produces 'b1'
至于为什么要有第一个参数,如果你看了 help(super) 就会发现它居然提供了个单参数的版本:
super(type) -> unbound super object
这个理解起来比较困难点。先说这个unbound,没绑定,就是说这个super对象没有实际绑定到某个对象上,它并不是可以直接用的。要怎么用呢?那就得注意到help(super)里面有一个 __get__ 方法,也就是说,super类还是一个Descriptor类!哎,这个Descriptor类展开又是好大一段,简单地说就是它可以把自己和某个object的属性绑定,使得访问这个属性的时候,实际上是在调用它的__get__/__set__方法:
class Descr(object):
def __get__(self, obj, tp): #最后一句传进来的 obj=x, tp=X
return 'get!'
class X(object):
t = Descr()
print x.t #this produces 'get!'
回到unbound super, 为了使用它,就要通过 get 方法把它再绑定到一个对象上。由于Descriptor的属性,特别适合这么用:
class A(object):
def foo(self):
print 'foo'
class B(A):
def foo(self):
self._super.foo()
B._super = super(B) #这还不能直接写在B的定义里,多蛋疼啊。
b.foo() #produces 'foo'
这是它的一个可能用法。我不确定是否还有其他更合适的用途,但是在这里实际上也并不是很好,尤其是遇到staticmethod的时候还会出错,再加上绕了这么大一个弯,实在不是很推荐使用。
据说unbound super的使用非常少,不知道现实意义有多少,也不知道当初为什么设计成这个样子,总之由于Python3.0已经改了(虽然仍然保留了unbound super),所以基本上还是可以认为这是设计的历史遗留问题。
参考文献(unbound super主要参考了这个系列):Things to Know About Python Super
同步到新浪微博
不要错过该问题的后续解决方案
如果你没找到答案,记得登录关注哦,大家会尽全力帮你解决的 ^___^
最专业的开发者社区
最前沿的技术问答,最纯粹的技术切磋。让你不知不觉中开拓眼界,提高技能,认识更多朋友。
分享到微博?
关闭理由:
删除理由:
忽略理由:
与已有问题重复
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
内容质量差,或不适合在本网站出现
无意义讨论型问题
其他原因(请补充说明)
举报理由:
带有人身攻击、辱骂、仇恨等违反条款的内容
与已有问题重复
内容质量差,或不适合在本网站出现
答非所问,不符合答题要求
其他原因(请补充说明)
补充说明:新手园地& & & 硬件问题Linux系统管理Linux网络问题Linux环境编程Linux桌面系统国产LinuxBSD& & & BSD文档中心AIX& & & 新手入门& & & AIX文档中心& & & 资源下载& & & Power高级应用& & & IBM存储AS400Solaris& & & Solaris文档中心HP-UX& & & HP文档中心SCO UNIX& & & SCO文档中心互操作专区IRIXTru64 UNIXMac OS X门户网站运维集群和高可用服务器应用监控和防护虚拟化技术架构设计行业应用和管理服务器及硬件技术& & & 服务器资源下载云计算& & & 云计算文档中心& & & 云计算业界& & & 云计算资源下载存储备份& & & 存储文档中心& & & 存储业界& & & 存储资源下载& & & Symantec技术交流区安全技术网络技术& & & 网络技术文档中心C/C++& & & GUI编程& & & Functional编程内核源码& & & 内核问题移动开发& & & 移动开发技术资料ShellPerlJava& & & Java文档中心PHP& & & php文档中心Python& & & Python文档中心RubyCPU与编译器嵌入式开发驱动开发Web开发VoIP开发技术MySQL& & & MySQL文档中心SybaseOraclePostgreSQLDB2Informix数据仓库与数据挖掘NoSQL技术IT业界新闻与评论IT职业生涯& & & 猎头招聘IT图书与评论& & & CU技术图书大系& & & Linux书友会二手交易下载共享Linux文档专区IT培训与认证& & & 培训交流& & & 认证培训清茶斋投资理财运动地带快乐数码摄影& & & 摄影器材& & & 摄影比赛专区IT爱车族旅游天下站务交流版主会议室博客SNS站务交流区CU活动专区& & & Power活动专区& & & 拍卖交流区频道交流区
空间积分0 信誉积分27 UID阅读权限10积分8帖子精华可用积分8 专家积分0 在线时间10 小时注册时间最后登录
白手起家, 积分 8, 距离下一级还需 192 积分
帖子主题精华可用积分8 专家积分0 在线时间10 小时注册时间最后登录
论坛徽章:0
问题是这样的,我从mysql中获取数据时,float类型且后面有两位小数的会自动转换为decimal类型,然后我在做循环求和的时候老是会报错,说float类型不能和decimal求和,然后就退出,我想问下各位前辈,这种问题的最佳解决方案是什么?因为我在网上看到有decimal和float类型的性能对比,前者比后者慢了很多,所以我不是很想用decimal类型来求和,毕竟不是一个精度要求很高的计算,我想的一种方案就是统一把decimal转换为float类型,但google和百度上都没找到相关解决方法,还请各位前辈赐教,在线等……
&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp
空间积分0 信誉积分27 UID阅读权限10积分8帖子精华可用积分8 专家积分0 在线时间10 小时注册时间最后登录
白手起家, 积分 8, 距离下一级还需 192 积分
帖子主题精华可用积分8 专家积分0 在线时间10 小时注册时间最后登录
论坛徽章:0
请各位不啬赐教
空间积分0 信誉积分599 UID阅读权限30积分1055帖子精华可用积分1055 专家积分0 在线时间220 小时注册时间最后登录
家境小康, 积分 1055, 距离下一级还需 945 积分
帖子主题精华可用积分1055 专家积分0 在线时间220 小时注册时间最后登录
论坛徽章:0
本帖最后由 pastebt 于
06:23 编辑
& & 这里面有好几个问题
首先,你数据库为什么会返回Decimal,是否因为你column类型设得不对,如果是,改对了就是了
其次,虽然Decimal慢,但是一般来讲会帮你避免很多问题,所以还是建议用它
再次,很简单亚float(Decimal(10.0))
北京皓辰网域网络信息技术有限公司. 版权所有 京ICP证:060528号 北京市公安局海淀分局网监中心备案编号:
广播电视节目制作经营许可证(京) 字第1234号
中国互联网协会会员&&联系我们:
感谢所有关心和支持过ChinaUnix的朋友们
转载本站内容请注明原作者名及出处新手自学求教,奇数求和问题..._python吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:22,184贴子:
新手自学求教,奇数求和问题...收藏
就是给定a,b两整数(如a=100,b=200)。求a,b两数之间奇数的和。请问该怎么写...我想用while循环来解决,可是我不知道将两个条件a&=200和a%2&0联用...求大家指点一下,多谢...
好吧,我想到了。请问还有没有什么更简便的方法吗?
python 2.7func = lambda a,b:sum(range(min(a,b) if min(a,b)%2 else min(a,b)+1,max(a,b)+1,2))func(100,200)
各位我看见一个最简单的解法了!
这是一个纯运算的题,不用内置函数即可:a,b=100,200print((a+1+(b-1))*(b-a)/4)
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或手机扫描二维码,把小组装进口袋
第三方登录:当前位置: >
> 批改文件后缀名的python,第一次写,想必肯定有更简单的方法,求指点
批改文件后缀名的python,第一次写,想必肯定有更简单的方法,求指点
sunget & at
修改文件后缀名的python,第一次写,想必肯定有更简单的方法,求指点  import&os
import&string
dirName&=&"./code/demo/"
li=os.listdir(dirName)
for&filename&in&li:
newname&=&filename
newname&=&newname.split(".")
if&newname[-1]=="txt":
newname[-1]="html"
newname&=&string.join(newname,".")
filename&=&dirName+filename
newname&=&dirName+newname
os.rename(filename,newname)
print&newname,"updated&successfully"
顺便问句,怎么发帖就要花分数啊?。。。郁闷
str&=&"hello.txt"
print&str.endswith(".txt")
print&str.replace(".txt",".html")sunglowwyt & &
& & (0)(0)
本问题标题:
本问题地址:
温馨提示:本问题已经关闭,不能解答。
暂无合适的专家
&&&&&&&&&&&&&&&
希赛网 版权所有 & &&&&湘教QS2-164&&增值电信业务经营许可证湘B2-

我要回帖

更多关于 python简单程序 的文章

 

随机推荐