1、类属性
类属性与实例属性不同。一个类的所有实例的值都相同的属性称为类属性。所有实例都共享类属性的值。类属性是在类级别定义的,而不是在构造方法__init__()方法内部定义的。与实例属性不同,使用类的名称访问类属性:
- >>> class Cat:
- ... name = 'Mimi'
- ...
上述Cat类包括一个名为name的类属性,可以使用类名称访问该属性:
- >>> Cat.name
- 'Mimi'
Cat类的每个实例都可以使用点表示法访问该属性:
- >>> mimi = Cat()
- >>> miaomiao = Cat()
- >>> mimi.name
- 'Mimi'
- >>> miaomiao.name # mimi和miaomiao的name都为'Mimi'
- 'Mimi'
但是,改变某个实例的类属性不会影响其他实例,它只会影响当前实例:
- >> class Cat:
- ... name = 'Mimi'
- ...
- >>> mimi = Cat()
- >>> mimi.name
- 'Mimi'
- >>> mimi.name = 'MIMI' # 将mimi的name属性改为大写
- >>> mimi.name
- 'MIMI'
- >>> Cat.name # Cat类的name属性并没有改变
- 'Mimi'
- >>> miaomiao = Cat() # 新实例化一个实例
- >>> miaomiao.name # 新实例的name并没有受到前一个实例影响
- 'Mimi'
2、实例方法
可以使用def关键字在类中定义任意数量的方法。方法的第一个参数通常为self,它用来引用和调用实例。在类中定义方法和定义普通的函数没有太多区别。下面在Cat类中定义了一个名为eat的方法:
- >>> class Cat:
- ... def __init__(self, name, age):
- ... self.name = name
- ... self.age = age
- ... def eat(self):
- ... print('{1}岁的{0}正在进食'.format(self.name, self.age))
- ...
可以使用实例调用类的实例方法:
- >>> mimi = Cat('Mimi', 1)
- >>> mimi.eat()
- 1岁的Mimi正在进食
3、类方法
类方法是将类本身作为对象进行操作的方法,也就是说,类方法调用的是类变量和类方法。类方法的语法格式如下:
@classmethod
def 方法名(cls[,参数]):
方法体
类方法使用@classmethod装饰,第一个参数为cls隐含参数,其余参数是可选的。下面给出两个简单的类方法的示例,第一个示例是创建只含有默认参数的类方法:
- @classmethod
- def cfun(cls):
- print('成功进入类方法')
第二个示例是创建含有其余参数的类方法:
- @classmethod
- def cfun(cls, name):
- cls.name = name
- print('成功进入类方法')
调用类方法有两种方式,一种是类外调用,采用“类名.方法名(参数)”的形式;另一种是类内调用,采用“cls.方法名(参数)”的形式:
- >>> class play_game(object):
- ... top_score = 100
- ... @classmethod
- ... def look_again(cls):
- ... print('再次查看最高分数:%d' % cls.top_score)
- ... @classmethod
- ... def look_socre(cls):
- ... print('最高分数:%d' % cls.top_score)
- ... cls.look_again() # 类内调用
- ...
- >>> play_game.look_socre() # 类外调用
- 最高分数:100
- 再次查看最高分数:100
上述程序中,在类外采用“类名.方法名(参数)”的形式调用了类方法look_socre()。look_socre()类方法用@classmethod进行了装饰,并且内部调用了类属性top_score,打印最高分数;然后在类内采用“cls.方法名(参数)”的形式调用了另一个类方法look_again()。look_again()类方法的的功能是再次打印最高分数。因此,执行类调用代码后,先执行look_socre()类方法中的打印语句,后执行look_again()类方法中的打印语句。
例如,创建一个学生类(Student),类属性city的默认值为'北京';在类中创建一个类方法get_city(),该类方法的功能是打印类属性。利用类方法set_city()修改城市,代码如下:
- >>> class Student:
- ... city = '北京'
- ... @classmethod
- ... def get_city(cls):
- ... print('城市:', cls.city)
- ... @classmethod
- ... def set_city(cls, cty):
- ... cls.city = cty
- ...
- >>> Student.get_city()
- 城市: 北京
- >>> Student.set_city('上海')
- >>> Student.get_city()
- 城市: 上海
下面比较一下类方法与实例方法的相同点和不同点。
类方法与实例方法的相同点如下:
①都可以在类内调用。
②都可以通过实例调用。
类方法与实例方法的不同点如下:
①类方法第一个默认参数为cls;实例方法第一个默认参数为self。
②类方法可以通过类名直接调用。
③类方法内只能调用类属性和类方法。
类方法的作用如下:
①方便类直接调用。
②可以修改类属性和类方法。
③减少创建多个实例时所占用的内存空间,加快运行速度。