函数和类属性(python)

时间:2015-08-19 04:24:47

标签: python python-3.x

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个参数clsage,所以我尝试了这个

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

对我来说,作为一个蟒蛇新手是令人难以置信的

有人可以对正在发生的事情有所了解吗?

4 个答案:

答案 0 :(得分:1)

这是在一方面引用类(使用Test)和实例化类的对象并在该对象上引用该对象(使用Test())之间的区别其他。当您使用该类时,您需要传递两个参数,您可以这样做,并且它可以正常工作。但是,当您使用类的对象时,第一个形式参数(形式参数是您定义的参数,即clsage)被视为对象本身。为清晰起见,它通常称为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

如您所见,xtest打印的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>

在示例的第一部分中,您将一个类对象作为第一个参数传递给类定义的类方法。

在示例的第二部分中,语言以静默方式将自引用传递给实例化对象的对象方法的第一个参数,从而阻止您使用第一个参数槽。