@classmethod 和 @staticmethod 的对比
@classmethod 类方法:不用通过实例化类就能访问的方法,但是用了该装饰器的方法(函数)要在括号内写类方法cls,并且使用了这个装饰器的方法内也要用cls.方法或者cls.属性 举例:
class Circle(object):
__pi = 3.14
def __init__(self, r):
self.r = r
@classmethod
def pi(cls):
return cls.__pi
def area(self):
"""
圆的面积
"""
return self.r ** 2 * self.__pi
print(Circle.pi())
circle1 = Circle(2)
print(circle1.pi())
注意:cls是类方法(代指一个类),self是实例方法(代指一个实例)
@staticmethod静态方法:不强制要求传递参数(即不需要写cls,使用了这个装饰器的方法内直接类.方法或者类.属性),可以将其理解为——@staticmethod 修饰的方法是放在类外的函数,为了方便,将其移动到了类里面,它对类的运行无影响。 举例:
class Date(object):
day = 0
month = 0
year = 0
def __init__(self, year=0, month=0, day=0):
self.day = day
self.month = month
self.year = year
@classmethod
def from_string(cls, date_as_string):
year, month, day = date_as_string.split('-')
date = cls(year, month, day)
return date
@staticmethod
def is_date_valid(date_as_string):
"""
用来校验日期的格式是否正确
"""
year, month, day = date_as_string.split('-')
return int(year) <= 3999 and int(month) <= 12 and int(day) <= 31
date1 = Date.from_string('2012-05-10')
print(date1.year, date1.month, date1.day)
is_date = Date.is_date_valid('2012-09-18')
@property:通过@property的方法来进行设置。这样可以隐藏属性名,让用户进行使用的时候无法随意修改。
- 用了该装饰器后,可以把方法当成一个属性来使用(即类.方法的时候后面不用加括号)
- 如下面的例子所示,用户可以调用这个方法(仿造的属性)来使用类里面的属性,但是不能修改该属性
例如:
class DataSet(object):
def __init__(self):
self._images = 1
self._labels = 2
@property
def images(self):
return self._images
@property
def labels(self):
return self._labels
l = DataSet()
print(l.images)
|