草庐IT

Metaprogramming

全部标签

python - 在 Ruby 或 Python 中,Class 的概念是否可以重写?

第一次堆栈溢出。我正在研究使用Ruby或Python提供的一些元编程功能,但首先我需要知道它们允许我扩展语言的程度。我需要能够做的主要事情是重写Class的概念。这并不意味着我想在运行时重写一个特定类,而是我想对什么是类进行自己的概念化。在这里更具体一点,我想做一些像人们通常所说的类,但我想遵循“openworld”假设。在普通类的“封闭世界”中,如果我将Poodle声明为Dog的子类并为Animal的子类,那么我知道Poodle不会也是FurCoat的一种。但是,在开放世界类中,我定义的Poodle对象可能是FurCoat类型的对象,也可能不是,在我解释我可以佩戴Poodle之前我们

python - 相当于 Haskell 中的 python eval

python中有一个名为eval的函数,它接受字符串输入并对其求值。>>>x=1>>>printeval('x+1')2>>>printeval('12+32')44>>>Haskell中什么是eval函数? 最佳答案 的确,在Haskell中,就像在Java或C++或类似语言中一样,您可以调用编译器,然后动态加载代码并执行它。然而,这通常是重量级的,几乎不是人们在其他语言中使用eval()的原因。人们倾向于在一种语言中使用eval(),因为考虑到该语言的功能,对于某些类别的问题,从类似于该语言本身的程序输入构造一个字符串更容易,而

python - 动态地向 Python 模块添加函数

我们的框架需要将某些功能包装在一些丑陋的样板代码中:defprefix_myname_suffix(obj):defactual():print'helloworld'obj.register(actual)returnobj我想这可以用装饰器来简化:@registerdefmyname():print'helloworld'然而,事实证明这相当棘手,主要是因为框架在模块级别寻找特定的函数名称模式。我在装饰器中尝试了以下方法,但无济于事:current_module=__import__(__name__)new_name=prefix+func.__name__+suffix#met

python - 当您拥有的只是一个可调用对象时,有没有一种方法可以访问方法的类

我的代码是这样的:classFoo:deffoo(self):passclassBar:deffoo(self):passf=random.choice((Foo().foo,Bar().foo))我如何访问Bar或Foo从f?f.__dict__几乎没有帮助,但作为repr(f)给出>'这一定是可能的,但是如何呢? 最佳答案 每个绑定(bind)方法都有__self__属性,这是instancetowhichthismethodisbound,orNone(从here复制)关于绑定(bind)方法的更多信息(来自DataModel

python - 在 Python 中使用 for 循环添加类属性

我试图从字典中生成一个类:classattr:forkeyinobjects_type:setattr(attr,key,lambdacl:list())这给出了在for循环期间未定义attr的错误。我知道我可以写:classattr:passforkeyinobjects_type:setattr(attr,key,lambdacl:list())但我确信我记得在某处看到过类似于第一个示例的代码。有谁知道是否可以写出类似于第一种形式的东西? 最佳答案 虽然不是很优雅,但是可以使用locals():>>>classc(object)

Python:动态地向对象添加字段

我想知道是否可以动态地向对象添加字段。例如,我希望能够添加如下内容:user=object()user.first_name='John'user.last_name='Smith'当我在Python命令行解释器中执行它时,我得到:AttributeError:'object'objecthasnoattribute'first_name'有什么想法吗? 最佳答案 试试这个:classObject:passobj=Object()obj.x=5 关于Python:动态地向对象添加字段,我

python - 为什么 Python 的 eval() 拒绝这个多行字符串,我该如何修复它?

我正在尝试评估以下制表符缩进的字符串:'''forindexinrange(10):os.system("echo"+str(index)+"")'''我得到,“出现错误:语法无效,第1行”它在提示什么?我是否需要缩进以匹配eval()语句,或将其写入字符串文件或临时文件并执行它,或其他什么?谢谢, 最佳答案 eval评估类似5+3的东西exec执行类似for...的东西>>>eval("forxinrange(3):printx")Traceback(mostrecentcalllast):File"",line1,inFile"

python - 为什么 Python 3 对 exec 的更改会破坏此代码?

我查看了SO上无数的“Pythonexec”线程,但找不到能回答我的问题的线程。非常抱歉,如果之前有人问过这个问题。这是我的问题:#Python2.6:prints'itisworking'#Python3.1.2:"NameError:globalname'a_func'isnotdefined"classTesting(object):def__init__(self):exec("""defa_func():print('itisworking')""")a_func()Testing()#Python2.6:prints'itisworking'#Python3.1.2:pri

python - 如何更改 Python 函数的表示?

>>>defhehe():...return"spam"...>>>repr(hehe)''我想要:>>>repr(hehe)'hehefunctioncreatedbyawesomeprogrammer'我该怎么做?将__repr__放在hehe函数中不起作用。编辑:如果你们想知道我为什么要这样做:>>>defaultdict(hehe)defaultdict(,{})我只是不喜欢它在这里显示的方式。 最佳答案 不,您不能更改函数对象的表示;如果你想添加文档,你会添加一个文档字符串:deffoo():"""Frobthebarba

python - 元类在现实世界中的良好用途(例如在 Python 中)

我正在学习Python中的元类。我认为这是一种非常强大的技术,我正在为它们寻找好的用途。我想要一些有关使用元类的实用示例的反馈。我不是在寻找有关如何编写元类的示例代码(那里有很多无用的元类的示例),而是在您应用该技术的真实示例中,它确实是合适的解决方案。规则是:没有理论上的可能性,但元类在实际应用程序中起作用。我将从我知道的一个例子开始:Django模型,用于声明式编程,其中基类Model使用元类从属性定义中填充有用ORM功能的模型对象。期待您的贡献。 最佳答案 在Python2.6和3.1中,Python标准库提供了一个abc.A