def add_age(cls,age):
cls.yrs_old = age
return cls
class Test:
age = add_age
a = Test()
a.age(5)
print(a.yrs_old)
所以我一直在玩python,这是我以前从未遇到的事情
这里我定义了一个名为add_age
的全局函数
已将add_age
分配给age
Test
属性
让我感到惊讶的是,add_age
需要2个参数cls
和age
,所以我尝试了这个
a = Test
a.age(a,5)
print(a.yrs_old)
按预期工作但是这样做:
a = Test()
a.age(a,5)
print(a.yrs_old)
抛出错误TypeError: add_age() takes 2 positional arguments but 3 were given
所以我说好了让我们试着拿出一个论点 所以我这样做了:
a = Test()
a.age(5)
print(a.yrs_old)
类本身自动作为第一个参数传递。几乎与self
类似,age
属性现在充当常规class method
对我来说,作为一个蟒蛇新手是令人难以置信的
有人可以对正在发生的事情有所了解吗?
答案 0 :(得分:1)
这是在一方面引用类(使用Test
)和实例化类的对象并在该对象上引用该对象(使用Test()
)之间的区别其他。当您使用该类时,您需要传递两个参数,您可以这样做,并且它可以正常工作。但是,当您使用类的对象时,第一个形式参数(形式参数是您定义的参数,即cls
和age
)被视为对象本身。为清晰起见,它通常称为self
,但您可以将其称为任何您喜欢的内容,例如cls
,就像您在此处所做的那样。
答案 1 :(得分:1)
试试这个。
key1, value1
key1, value2
key2, value3
通常你不应该在全球范围内定义函数。
编辑:嗯,当我复制粘贴代码时,它对我来说非常适合......
答案 2 :(得分:1)
看一下这个例子:
>>> def test (x):
print(id(x))
>>> class Foo:
bar = test
>>> a = Foo()
>>> a.bar()
60589840
>>> id(a)
60589840
如您所见,x
内test
打印的ID与实例a
的ID相同。因此,第一个参数实际上是对象实例传递的内容:self
。
就像在class
构造中定义方法一样,类的函数成员都是方法。你如何分配它们并不重要;您甚至可以在创建类型之后执行:
>>> def hello (self):
print('Hello world', id(self))
>>> Foo.hello = hello
>>> a.hello()
Hello world 60589840
所以最后,你看到的只是传递给方法的隐式self
。
答案 3 :(得分:1)
你看到了蟒蛇语的瑕疵:
1)对象自动通过" self"参数,隐藏在调用中但不在声明中。
2)可以针对类定义调用类的静态方法,即使该类尚未实例化。
3)当你调用一个非实例化类的静态方法时,就没有" self"可以自动传递给它的对象,你必须提供一个对象来填充第一个参数。
4)在语言的原始定义中,类定义对象与普通的实例化对象并不完全相同,并且语言无法传递一个类定义对象,其中需要一个自我对象。 / p>
在示例的第一部分中,您将一个类对象作为第一个参数传递给类定义的类方法。
在示例的第二部分中,语言以静默方式将自引用传递给实例化对象的对象方法的第一个参数,从而阻止您使用第一个参数槽。