本文主要介绍Python中,内置装饰器@property、@staticmethod、@classmethod的使用方法,以及相关的示例代码。

1、@property的使用

@property是python的一种装饰器,是用来修饰方法的。@property是把类内方法当成属性来使用,使用@property装饰器来创建只读属性,@property装饰器会将方法转换为相同名称的只读属性,必须要有返回值,相当于getter

只读属性就是只有@func.getter,没有定义@func.setter

class Car:
    def __init__(self, name, price):
        self._name = name
        self._price = price    
    @property
    def car_name(self):
        return self._name
     # car_name可以读写的属性   
     @car_name.setter
     def car_name(self, value):
         self._name = value
     # car_price是只读属性 
     @property
     def car_price(self):
         return str(self._price) + '万'

2、@staticmethod的使用

@staticmethod 静态方法不能使用类变量和实例变量,装饰器的函数不传入self或者cls,则不能访问类属性和实例属性。
class cal:
    cal_name = '计算器'
    def __init__(self,x,y):
        self.x = x
        self.y = y
    @property           #在cal_add函数前加上@property,使得该函数可直接调用,封装起来
    def cal_add(self):
        return self.x + self.y
    @classmethod        #在cal_info函数前加上@classmethon,则该函数变为类方法,该函数只能访问到类的数据属性,不能获取实例的数据属性
    def cal_info(cls):  #python自动传入位置参数cls就是类本身
        print('这是一个%s'%cls.cal_name)   #cls.cal_name调用类自己的数据属性
    @staticmethod       #静态方法 类或实例均可调用
    def cal_test(a,b,c): #改静态方法函数里不传入self 或 cls
        print(a,b,c)

3、@classmethod的使用

@classmethod是用来指定一个类的方法为类方法,没有此参数指定的类的方法为实例方法,类方法的第一个参数cls,而实例方法的第一个参数是self,表示该类的一个实例。
class A(object):  
     bar = 1  
     def foo(self):  
         print 'foo'  
     @staticmethod  
     def static_foo():  
         print 'static_foo'  
         print A.bar  
     @classmethod  
     def class_foo(cls):  
         print 'class_foo'  
         print cls.bar  
         cls().foo()  
A.static_foo()  
A.class_foo() 

4、@staticmethod和@classmethod区别

相关文档Python中@staticmethod和@classmethod区别及使用示例代码

Python3通过装饰器来创建property

推荐文档