在查阅pytorch的official tutorial的过程中,发现@property的修饰器语法,涉及到Python语言中的属性,在多方搜索之后对于@property的用法仍然很迷,感觉如同鸡肋。
常见的属性起因于python的动态语言特性,主要针对类而言:
类属性
class Test:
name = "Hello"
name就是类属性,我们可以直接通过类的__dict__里拿到这个值。也可以直接使用Test.name来调用。 Test.dict[“name”],在定义类属性之后,虽然这个属性属于类所有,但是由这个类实例化而来的所有实例均可以访问。
在__init__()外初始化,在内部用classname.类属性名调用,外部既可以用classname.类属性名又可以用instancename.类属性名来调用。
实例属性
实例属性在__init__()运行之后才被确定,内部调用时都需要加上self.,外部调用时用instancename.propertyname
class Test:
name = “Hell”
def init(self, user):
self.user = user
Fuck = Test("fuck")
这里面的self.user就是实例属性,可以通过Fuck.user来调用,也能用Fuck.dict[“user”]来调用。
Attention Point
实际上,上面这一段代码运行后,当我们使用Fuck.name调用属性的时候,会发现值是fuck。此时,实例属性与类属性同名而掩盖住了类属性,导致程序不能直接使用self.name调用类属性。
此时可以使用Fuck.class.dict[“name”]来访问类属性。或者删掉重名的实例属性del Fuck.name
之后,再调用Fuck.name这时我们就能调用到类属性了。然而,此时会发现Fuck.dict[“name”]会报错,提醒你没有这个key。这很好理解,Fuck.__dict__这个字典存储的是Fuck这个实例的属性,而不是Test这个类的。