有一段代码看不太懂,求解释

gqw0815 2017-03-27 07:32:12
class ModelMetaclass(type):

def __new__(cls, name, bases, attrs):
if name=='Model':
print(name)
return type.__new__(cls, name, bases, attrs) #第一个return
print(name)
print('Found model: %s' % name)
mappings = dict()
for k, v in attrs.items():
if isinstance(v, Field):
print('Found mapping: %s ==> %s' % (k, v))
mappings[k] = v
for k in mappings.keys():
attrs.pop(k)
attrs['__mappings__'] = mappings
attrs['__table__'] = name
return type.__new__(cls, name, bases, attrs)

为什么 第一个return 执行完后还会往后面执行??
...全文
153 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
gqw0815 2017-03-29
  • 打赏
  • 举报
回复
引用 13 楼 CDSoftwareWj 的回复:
ModelMetaclass("Model", (), {}) 要真执行了,因该是: print(name) print(name) print('Found model: %s' % name) 这样的输出顺序,怎么可能是你的那种 Found mode在中间???
是我在测试时写成了这样 print('Found model: %s' % name) print(name)
CDSoftwareWj 2017-03-29
  • 打赏
  • 举报
回复
ModelMetaclass("Model", (), {}) 要真执行了,因该是: print(name) print(name) print('Found model: %s' % name) 这样的输出顺序,怎么可能是你的那种 Found mode在中间???
gqw0815 2017-03-28
  • 打赏
  • 举报
回复
谢谢各位!还是不太理解,可能是我这里有些东西没搞清楚,明天结贴给分
gqw0815 2017-03-28
  • 打赏
  • 举报
回复
引用 10 楼 CDSoftwareWj 的回复:


其实仔细看了看程序,你确定你第一段程序 执行 return后还向下执行了???????哈哈哈哈哈



是执行了的……
CDSoftwareWj 2017-03-28
  • 打赏
  • 举报
回复
其实仔细看了看程序,你确定你第一段程序 执行 return后还向下执行了???????哈哈哈哈哈
CDSoftwareWj 2017-03-28
  • 打赏
  • 举报
回复
递归是否要跳出,是根据一定条件来的, 你第一段程序 定义了ModelMetaclass,从type继承过来,当然 type有__new__定义当然 会往下再执行一层递归调用 你第二段程序 你程序是继承 于 str , python 对 int, str, tuple 这类的类是特殊处理的,你举的例子都不对
CDSoftwareWj 2017-03-28
  • 打赏
  • 举报
回复
uiuiy1 说的已经很清楚了
gqw0815 2017-03-28
  • 打赏
  • 举报
回复
引用 6 楼 uiuiy1 的回复:
是不是递归取决于你的 type 参数,看你说的 “执行完后还会往后面执行” 那应该你的type = ModelMetaclass()
type应该是ModelMetaclass的父类吧
屎克螂 2017-03-28
  • 打赏
  • 举报
回复
是不是递归取决于你的 type 参数,看你说的 “执行完后还会往后面执行” 那应该你的type = ModelMetaclass()
gqw0815 2017-03-28
  • 打赏
  • 举报
回复
引用 2 楼 CDSoftwareWj 的回复:
多明白啊,第一个return 那里不是又调了type.__new__() 函数么??!!当然要再执行完__new__()函数再返回了
class CapStr(str): def __new__(cls,string): string = string.upper() return str.__new__(cls,string) print('----------') a = CapStr("asdfffff") print(a) 就像在这里,return后面的就不执行了,但是为什么上面的代码里的会执行?
gqw0815 2017-03-28
  • 打赏
  • 举报
回复
引用 2 楼 CDSoftwareWj 的回复:
多明白啊,第一个return 那里不是又调了type.__new__() 函数么??!!当然要再执行完__new__()函数再返回了
没太懂……,执行哪个__new__() ?
gqw0815 2017-03-28
  • 打赏
  • 举报
回复
引用 1 楼 jon_me 的回复:
你确定你这个不是递归么?
不是递归
CDSoftwareWj 2017-03-28
  • 打赏
  • 举报
回复
多明白啊,第一个return 那里不是又调了type.__new__() 函数么??!!当然要再执行完__new__()函数再返回了
John_Me 2017-03-28
  • 打赏
  • 举报
回复
你确定你这个不是递归么?

37,720

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧