gpt4 book ai didi

Python模型继承和模型声明的顺序

转载 作者:行者123 更新时间:2023-11-28 19:24:15 25 4
gpt4 key购买 nike

以下代码:

class ParentModel(models.Model):
pass

class ChildA(ChildB):
pass

class ChildB(ParentModel):
pass

显然消息失败。

NameError: name "ChildB" is not defined

有没有办法在不实际重新排序类定义的情况下解决这个问题? (代码是自动生成的,大约45K行,类的顺序是随机的)。

最佳答案

完美主义者别看!!这是一种解决方法(hack);解决方案是解决不正确的声明顺序。

警告:这非常愚蠢。

概念:

想象一个任何东西都可以存在的命名空间。从字面上看,任何被要求的东西。通常不是最聪明的事情,但乱序声明也不是聪明的,为什么不呢?

乱序类的关键问题是依赖类在它们的依赖项(基类)之前被定义。在评估时,基类未定义,导致 NameError。

将每个类包装在 try except 语句中所花费的精力与重写模块一样多,因此可以立即忽略。

必须使用一种更有效(就程序员时间而言)的方法来抑制 NameError。这可以通过使命名空间完全允许来实现,例如,如果查找对象不存在,则应创建它从而避免 NameError。这是这种方法的明显危险,因为查找变成了创建。

实现:

我相信 Python 中的命名空间是字典,字典方法可以重载,包括查找函数:__getitem__。所以 mr_agreeable 是一个字典子类,它有一个重载的 __getitem__ 方法,当查找键不存在时,它会自动创建一个空白类。 mr_agreeable 的实例作为 classes.py 脚本的命名空间传递给 execfile。创建的 execfile 调用的对象(除了内置函数)与调用脚本的 globals() dict 合并:hack.py。

这是可行的,因为 Python 不关心类的基类是否在事后更改。

这可能取决于实现,我不知道。测试于:Win7 64 位上的 Python 2.7.3 64 位。

假设您的无序类在 classes.py 中定义:

class ParentModel(object):
name = "parentmodel"

class ChildC(ChildA):
name = "childc"

class ChildA(ChildB):
name = "childa"

class ChildB(ParentModel):
name = "childb"

加载器脚本,我们称之为 hack.py:

from random import randint
from codecs import encode

class mr_agreeable(dict):
sin_counter = 0
nutty_factor = 0
rdict = {0 : (0, 9), 200 : (10, 14), 500 : (15, 16), 550 : (17, 22)}
def __getitem__(self, key):
class tmp(object):
pass
tmp.__name__ = key
if(not key in self.keys()):
self.prognosis()
print self.insanity()
return self.setdefault(key, tmp)
def prognosis(self):
self.sin_counter += 1
self.nutty_factor = max(filter(lambda x: x < self.sin_counter, self.rdict.keys()))
def insanity(self):
insane_strs = \
[
"Nofbyhgryl", "Fher, jul abg?", "Sbe fher", "Fbhaqf terng", "Qrsvangryl", "Pbhyqa'g nterr zber",
"Jung pbhyq tb jebat?", "Bxl Qbnxl", "Lrc", "V srry gur fnzr jnl", "Zneel zl qnhtugre",
"Znlor lbh fubhyq svk gung", "1 AnzrReebe vf bar gbb znal naq n 1000'f abg rabhtu", "V'ir qbar qvegvre guvatf",
"Gur ebbz vf fgnegvat gb fcva", "Cebonoyl abg", "Npghnyyl, ab ..... nyevtug gura", "ZNXR VG FGBC",
"BU TBQ AB", "CYRNFR AB", "LBH'ER OERNXVAT CLGUBA", "GUVF VF ABG PBAFRAGHNY", "V'Z GRYYVAT THVQB!!"
]
return encode("ze_nterrnoyr: " + insane_strs[randint(*self.rdict[self.nutty_factor])], "rot13")

def the_act():
ns = mr_agreeable()
execfile("classes.py", ns)
hostages = list(set(ns.keys()) - set(["__builtins__", "object"]))
globals().update([(key, ns[key]) for key in hostages])

the_act()

mr_agreeable 充当编译的 classes.py 的允许命名空间。他提醒你这是一种糟糕的形式。

关于Python模型继承和模型声明的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16907186/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com