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区别