类里面的 @staticmethod,@classmethod,@property

关于@staticmethod:

返回函数的静态方法,该方法不强制要求传递参数

文档里面的解释是:静态方法不会收到隐式的第一个参数

@staticmethod 静态方法只是名义上归属类管理,但是不能使用类变量和实例变量,是类的工具包

该函数不传入 self 或者 cls

class demo(object):
   @staticmethod
   def f():
       print "跑起来了"

demo().f()       # 第一种方式调用
demo.f() #第二种
res = demo() #第三种
res.f()

方法加入了 @staticmethod 就不需要加上参数 self 了,上图如果去掉 @staticmethod 就会报错

使用staticmethod的原因是如果您有一些可以作为独立函数编写的东西(不是任何类的一部分),但是您希望将其保留在类中,因为它在某种程度上与类相关。(例如,它可以是一个不需要来自类的任何信息的函数,但是它的行为是特定于类的,因此子类可能希望重写它。)在许多情况下,编写一些与独立函数而不是staticmethod一样有意义

 

关于@classmethod

classmethod修饰符对应的函数不需要实例化,不需要 self 参数,但第一个参数需要是表示自身类的cls 参数,可以用来调用类的属性,类的方法,实例化对象等

class demo(object):
   bar = 1
   def func1(self):
       print "这是function1"

   @classmethod
   def func2(cls):
       print "这是function2"
       print cls.bar
       cls().func1()


# demo.func1()   # 报错,想调用 func1 必须实例化
demo.func2()
# 结果:
# 这是function2
# 1
# 这是function1

 

关于@property

可以使用@property装饰器来创建只读属性,@property装饰器会将方法转换为相同名称的只读属性,可以与所定义的属性配合使用,这样可以防止属性被修改

class demo(object):
   def __init__(self, value):
       self.data1 = value

   @property
   def az(self):
       return self.data1

   @az.setter       # 设置
   def az(self, data):
       self.data1 = data

   @az.deleter      # 删除
   def az(self):      
       self.data1 = 0

datas = demo(30)
print datas.az    # 30

datas.az = 123
print datas.az    # 123

del datas.az
print datas.az    # 0

 

原文地址:https://www.cnblogs.com/yanruizhe/p/15126785.html