面向对象之静态方法、类方法
有些时候需要按条件选择性地创建对象,可以使用静态方法或者类方法达到目的。
1静态方法@staticmethod
之前,我们在类中定义的方法都是对象方法,也就是说这些方法都是发送给对象的消息。实际上,我们写在类中的方法并不需要都是对象方法,例如我们定义一个“三角形”类,通过传入三条边长来构造三角形,并提供计算周长的方法,但是传入的三条边长未必能构造出三角形对象,因此我们可以先写一个方法来验证三条边长是否可以构成三角形,这个方法很显然就不是对象方法,因为在调用这个方法时三角形对象尚未创建出来(因为都不知道三条边能不能构成三角形),所以这个方法是属于三角形类而并不属于三角形对象的。可以使用静态方法来解决这类问题。
class Triangle(object):
def __init__(self, a, b, c):
self._a = a
self._b = b
self._c = c
@staticmethod
def is_valid(a, b, c):
return a + b > c and b + c > a and a + c > b
def perimeter(self):
return self._a + self._b + self._c
def main(a,b,c):
if Triangle.is_valid(a, b, c)==True:
t = Triangle(a, b, c)
print('三角形周长:%s'% t.perimeter())
else:
print('无法构成三角形.')
if __name__ == '__main__':
main(3,4,5)
main(1,2,3)
2类方法@classmethod
和静态方法比较类似,Python还可以在类中定义类方法,类方法的第一个参数约定名为cls,它代表的是当前类相关的信息的对象(类本身也是一个对象,有的地方也称之为类的元数据对象),通过这个参数我们可以获取和类相关的信息并且可以创建出类的对象。
class Triangle(object):
def __init__(self, a=0, b=0, c=0):
self._a = a
self._b = b
self._c = c
@classmethod
def is_valid(cls):
return cls(a,b,c)
def perimeter(self):
return self._a + self._b + self._c
def main(a,b,c):
if a+ b > c and b + c > a and a + c > b:
t= Triangle.is_valid()
print('三角形周长:%s'% t.perimeter())
else:
print('无法构成三角形.')
if __name__ == '__main__':
main(3,4,5)
main(1,2,3)
输出相同:
三角形周长:12
无法构成三角形.