【Python基础知识】Python类的类属性、实例方法和类方法

发布 : python培训      来源:python干货资料

2021-02-09 15:44:34

1、类属性

类属性与实例属性不同。一个类的所有实例的值都相同的属性称为类属性。所有实例都共享类属性的值。类属性是在类级别定义的,而不是在构造方法__init__()方法内部定义的。与实例属性不同,使用类的名称访问类属性:

  1. >>> class Cat:
  2. ... name = 'Mimi'
  3. ...

上述Cat类包括一个名为name的类属性,可以使用类名称访问该属性:

  1. >>> Cat.name
  2. 'Mimi'

Cat类的每个实例都可以使用点表示法访问该属性:

  1. >>> mimi = Cat()
  2. >>> miaomiao = Cat()
  3. >>> mimi.name
  4. 'Mimi'
  5. >>> miaomiao.name # mimi和miaomiao的name都为'Mimi'
  6. 'Mimi'

但是,改变某个实例的类属性不会影响其他实例,它只会影响当前实例:

  1. >> class Cat:
  2. ... name = 'Mimi'
  3. ...
  4. >>> mimi = Cat()
  5. >>> mimi.name
  6. 'Mimi'
  7. >>> mimi.name = 'MIMI' # 将mimi的name属性改为大写
  8. >>> mimi.name
  9. 'MIMI'
  10. >>> Cat.name # Cat类的name属性并没有改变
  11. 'Mimi'
  12. >>> miaomiao = Cat() # 新实例化一个实例
  13. >>> miaomiao.name # 新实例的name并没有受到前一个实例影响
  14. 'Mimi'

2、实例方法

可以使用def关键字在类中定义任意数量的方法。方法的第一个参数通常为self,它用来引用和调用实例。在类中定义方法和定义普通的函数没有太多区别。下面在Cat类中定义了一个名为eat的方法:

  1. >>> class Cat:
  2. ... def __init__(self, name, age):
  3. ... self.name = name
  4. ... self.age = age
  5. ... def eat(self):
  6. ... print('{1}岁的{0}正在进食'.format(self.name, self.age))
  7. ...

可以使用实例调用类的实例方法:

  1. >>> mimi = Cat('Mimi', 1)
  2. >>> mimi.eat()
  3. 1岁的Mimi正在进食

【Python基础知识】Python类的类属性、实例方法和类方法

3、类方法

类方法是将类本身作为对象进行操作的方法,也就是说,类方法调用的是类变量和类方法。类方法的语法格式如下:

@classmethod

def 方法名(cls[,参数]):

方法体

类方法使用@classmethod装饰,第一个参数为cls隐含参数,其余参数是可选的。下面给出两个简单的类方法的示例,第一个示例是创建只含有默认参数的类方法:

  1. @classmethod
  2. def cfun(cls):
  3. print('成功进入类方法')

第二个示例是创建含有其余参数的类方法:

  1. @classmethod
  2. def cfun(cls, name):
  3. cls.name = name
  4. print('成功进入类方法')

调用类方法有两种方式,一种是类外调用,采用“类名.方法名(参数)”的形式;另一种是类内调用,采用“cls.方法名(参数)”的形式:

  1. >>> class play_game(object):
  2. ... top_score = 100
  3. ... @classmethod
  4. ... def look_again(cls):
  5. ... print('再次查看最高分数:%d' % cls.top_score)
  6. ... @classmethod
  7. ... def look_socre(cls):
  8. ... print('最高分数:%d' % cls.top_score)
  9. ... cls.look_again() # 类内调用
  10. ...
  11. >>> play_game.look_socre() # 类外调用
  12. 最高分数:100
  13. 再次查看最高分数:100

上述程序中,在类外采用“类名.方法名(参数)”的形式调用了类方法look_socre()。look_socre()类方法用@classmethod进行了装饰,并且内部调用了类属性top_score,打印最高分数;然后在类内采用“cls.方法名(参数)”的形式调用了另一个类方法look_again()。look_again()类方法的的功能是再次打印最高分数。因此,执行类调用代码后,先执行look_socre()类方法中的打印语句,后执行look_again()类方法中的打印语句。

例如,创建一个学生类(Student),类属性city的默认值为'北京';在类中创建一个类方法get_city(),该类方法的功能是打印类属性。利用类方法set_city()修改城市,代码如下:

  1. >>> class Student:
  2. ... city = '北京'
  3. ... @classmethod
  4. ... def get_city(cls):
  5. ... print('城市:', cls.city)
  6. ... @classmethod
  7. ... def set_city(cls, cty):
  8. ... cls.city = cty
  9. ...
  10. >>> Student.get_city()
  11. 城市: 北京
  12. >>> Student.set_city('上海')
  13. >>> Student.get_city()
  14. 城市: 上海

下面比较一下类方法与实例方法的相同点和不同点。

类方法与实例方法的相同点如下:

①都可以在类内调用。

②都可以通过实例调用。

类方法与实例方法的不同点如下:

①类方法第一个默认参数为cls;实例方法第一个默认参数为self。

②类方法可以通过类名直接调用。

③类方法内只能调用类属性和类方法。

类方法的作用如下:

①方便类直接调用。

②可以修改类属性和类方法。

③减少创建多个实例时所占用的内存空间,加快运行速度。

THE END  

声明:本站稿件版权均属中公教育优就业所有,未经许可不得擅自转载。

领取零基础自学IT资源

涉及方向有Java、Web前端、UI设计、软件测试、python等科目,内容包含学习路线、视频、源码等

点击申请领取资料

点击查看资料详情 

收起 


 相关推荐

问题解答专区
返回顶部