参数和Signatu的使用

2024-06-02 05:34:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我是一个比较新的Python学习者。所以,在使用不同的编码技术时,我发现:

from inspect import Parameter, Signature

def make_signature(names):
    return Signature(Parameter(name, Parameter.POSITIONAL_OR_KEYWORD) for name in names)

class Structure:
    list_fields = []
    def __init__(self, *args):
        for name, val in zip(self.list_fields, args):
            setattr(self, name, val)

class Stock(Structure):
    __signature__ = make_signature(['name', 'shares', 'price'])
    #list_fields = ['name', 'shares', 'price'] 

class Point(Structure):
    list_fields = ['x', 'y']

obj2=Point(20,40)
obj1=Stock('googl', 100, 8000)
print(obj1.name)

我了解Structure类及其与继承Structure类的Point类的集成,因此它是__init__方法。但是当我创建Point类的对象时,它不支持位置参数,但是Stock类对象确实支持这个特性。在

  • 有谁能给我解释一下为什么会发生这种情况吗?在
  • 何时使用参数、签名?在
  • 这和元编程有什么关系?在
  • 还有一些类似的例子。在
  • make_signature方法中,Parameter函数的用途是什么,make_signature方法在做什么?在
  • 程序的流程,即哪个函数返回给谁,反之亦然。当cd6}类中的{cd6>调用^{myknowledge}?在

我试着读了一些关于Signature的文档,但这些例子不是这种类型的,对我来说太沉重了,因为我一直在回溯这些代码文档,我也找不到任何关于Python中元编程的好的解释性文档。在


Tags: 方法name文档selffieldsmakeparameterdef
1条回答
网友
1楼 · 发布于 2024-06-02 05:34:59

Can anyone please explain to me why & how this happens?

这两个类都只接受由^{中的*args指定的位置参数:

s = Stock('pos_arg1', 'pos_arg2', 'pos_arg3')
p = Point('pos_arg1', 'pos_arg2', 'pos_arg3')

区别在于,Stock实际上并没有设置任何参数,因为,由于您注释掉了list_fieldsStructure.__init__将使用空的Structure.list_fields。这就是为什么尝试在Stock实例上访问name会引发一个AttributeError。在

在这两种情况下,list_fields限制了可以设置的参数。对于前一个片段中的Point实例,x将等于pos_arg1y将等于{};pos_arg3本质上是被抛出的。这是由于zip构建元组,直到其中一个iterable用尽:

^{pr2}$

印刷品:

x pos_arg1
y pos_arg2

即使列表为空,也不会提供循环。这是初始化Stock时发生的情况,Structure.list_fields = []被使用:

for i, j in zip([], ['pos_arg1', 'pos_arg2', 'pos_arg3']):
    print(i, j)

不打印任何内容,因此不会调用setattr。在

When to use Parameter, Signature?

当你想支持你的类(或者在一般情况下是可调用的)的时候,你可以在你的类中添加一个__signature__属性(就像Stock)并通过类似inspect.signature的工具来获取它,例如:

inspect.signature(Stock)
Out[16]: <Signature (name, shares, price)>

inspect.signature(Point)
Out[17]: <Signature (*args)>

Signature尝试查看对象是否具有object.__signature__,如果是,则在调用时构造签名的表示形式。在

此外,您可以bind一个签名给self并让它支持POSITIONAL_OR_KEYWORD参数。在

一般来说,这只会在极少数情况下作为要求出现。简而言之:你会知道你是否需要它。在

Also how is this related to meta programming?

这个具体的例子与此无关。你可以用元编程来增强它,正如你在我将要链接的演示中看到的那样。在

Some more examples like this.

这要求太宽泛了。但是您的例子来自davidbeazly的元编程演示here's the presentation。在

To my knowledge Stock function and Point function is calling Structure class but where does the make_signature method comes in?

StockPoint都使用Structure.__init__,它将用list_fields中定义的属性填充实例字典。在

当创建类时,__signature__ = make_signature([...])正在执行,Python在遇到它时执行class的主体。make_signature将被调用并创建一个Signature对象,并对__signature__进行赋值。在

相关问题 更多 >