几种方法的区别:
1、实例方法(普通方法)———————————随着实例属性的改变而改变
2、类方法(无论是类调用还是实例调用)————都是类属性的值,不随实例属性的变化而变化
3、静态方法—————————————————不可以访问类属性,故直接输出传入方法的值
一、回顾对象方法(实例方法)
如下类中定义的方法都是对象方法,对象方法第一个参数永远时self,表示创建的实例本身
# 如下类中定义的方法都是对象方法
class Student(object):
# __init__是一个特殊方法用于在创建对象时进行初始化操作
# 通过这个方法我们可以为学生对象绑定name和age两个属性
# 注意到__init__方法的第一个参数永远是self,表示创建的实例本身
def __init__(self, name, age):
self.name = name
self.age = age
def study(self, course_name):
print('%s正在学习%s.' % (self.name, course_name))
def watch_movie(self):
if self.age < 18:
print('%s只能观看熊出没' % self.name)
else:
print('%s正在观看灾难片' % self.name)
def main():
# 创建学生对象并指定姓名和年龄
stu1 = Student('小明', 2)
stu1.age = 50
stu1.study('python程序设计')
stu1.watch_movie()
if __name__ == '__main__':
main()
二、静态方法和类方法
静态方法:
实际上,我们写在类中的方法并不需要都是对象方法,例如我们定义一个“三角形”类,通过传入三条边长来构造三角形,并提供计算周长和面积的方法,但是传入的三条边长未必能构造出三角形对象,因此我们可以先写一个方法来验证三条边长是否可以构成三角形,这个方法很显然就不是对象方法,因为在调用这个方法时三角形对象尚未创建出来(因为都不知道三条边能不能构成三角形),所以这个方法是属于三角形类而并不属于三角形对象的。我们可以使用静态方法来解决这类问题,代码如下所示。
特点:
静态方法第一个参数不是self,使用时,直接通过类调用,而不是类的对象调用
# 静态方法
from math import sqrt
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 a+c > b and b+c > a
def area(self):
p = (self.a + self.b + self.c)/2
s = sqrt(p*(p-self.a)*(p-self.b)*(p-self.c))
return s
def main():
a, b, c = 3, 4, 5
if Triangle.is_valid(a, b, c):
triangle = Triangle(a, b, c)
print(triangle.area())
else:
print("不是三角形")
if __name__ == '__main__':
main()
类方法:@classmethod,类直接调用
# 类方法@classmethod,类直接调用
from time import time, localtime, sleep
class Clock(object):
"""数字时钟"""
def __init__(self, hour=0, minute=0, second=0):
self._hour = hour
self._minute = minute
self._second = second
@classmethod
def now(cls):
ctime = localtime(time())
return cls(ctime.tm_hour, ctime.tm_min, ctime.tm_sec)
def run(self):
"""走字"""
self._second += 1
if self._second == 60:
self._second = 0
self._minute += 1
if self._minute == 60:
self._minute = 0
self._hour += 1
if self._hour == 24:
self._hour = 0
def show(self):
"""显示时间"""
return '%02d:%02d:%02d' % \
(self._hour, self._minute, self._second)
def main():
# 通过类方法创建对象并获取系统时间
clock = Clock.now() # 相当于创建了一个实例,并传入当前时间
while True:
print(clock.show())
sleep(1)
clock.run()
if __name__ == '__main__':
main()