上一节介绍了类、对象、类属性、实例属性的概念以及类属性,实例属性,实例方法的调用
这一节,我们学习类方法、静态方法、类继承、重写以及实际中的应用
上节课,我们定义了一个People类:
# -*-coding:utf8-*-
"""
=========================================
author: Lujier time: 2019/5/26
E-mail: 2327994109@qq.com
==========================================
"""
class People:
"""
定义一个人类People,
有属性:吃饭,睡觉,年龄,身高,体重,性别, 名字
行为:跑步
"""
behavior_1 = "吃饭" # 类属性定义
behavior_2 = '睡觉'
def __init__(self, name, sex, age):
"""
:param name: user's name---->str
:param sex: user's sex---->str
:param age: user's age---->int
"""
self.name = name # 实例属性定义
self.sex = sex
self.age = age
def run(self, minites, distance): # 定义一个跑步的方法,实例方法
"""
:param minites: ran for how long time----->int
:param distance: ran many kilometers----->int
"""
print(f"{self.name}在{minites}分钟跑了{distance}公里")
我们继续在原来的基础上进行学习
类方法、静态方法、继承、方法重写的定义:
1 类方法:
概念:使用装饰器 @classmethod,第一个参数必须是类,该参数名约定为cls,通过它来传递类的属性的方法
调用:类和实例对象都可以调用
应用场景:需要站在类的角度进行的行为,那么就应该定义为类方法
@classmethod # 类方法装饰器
def skill_introduce(cls): # 类方法,cls代表的是类本身
print(f"会{cls.behavior_1},并且还会{cls.behavior_2}")
调用:
2 静态方法:
概念:使用装饰器 @staticmethod,第一个参数随意,可以是cls,self,但是方法体中不能使用类或实例的任何
方法和属性
调用:类和实例对象都可以调用
应用场景:存放逻辑代码,内部不需要引用类属性和实例属性
@staticmethod # 静态方法装饰器
def static_introduce1():
print(f"静态方法1:吃饭睡觉,是亘古不变的技能,哈啊")
@staticmethod # 静态方法装饰器
def static_introduce2(name):
print(f"静态方法3:我的名字是:{name}")
3 继承:子类通过继承父类获取父类的所有属性的方法,被继承的是父类(基类),继承者是子类
Girl类继承People:
class Girl(People):
def __init__(self, name, age, sex="Girl"):
super().__init__(name, sex, age)
def beauty_nick_name(self): # 定义一个方法,女性的一些其他褒义称呼
print("小美妞,大美女,御姐")
通过截图,我们可以知道,如果继承父类,那么也会自然而然的继承父类的类属性,实例属性,类方法,实例方法,静态方法等等内容
4. 重写:
依旧是3中的例子,定义一个Girl类,并继承People类,在这里,我们需要
1) 增加一个属性:体重weight
2) People中run()方法重写
class Girl(People):
def __init__(self, name, age, weight, sex="Girl"):
"""
__init__方法重写,增加weight属性
:param name: name ----- >str
:param age: age-------> int
:param weight: weight ---->int
:param sex: sex---->str
"""
super().__init__(name, sex, age) # 继承People的__init__函数
self.weight = weight
def beauty_nick_name(self): # 定义一个方法,女性的一些其他褒义称呼
print("小美妞,大美女,御姐")
def run(self, minutes, distance): # 重写run方法
super().run(minites, distance)
print(f"{self.name}体重是:{self.weight}")
其实,增加了一个属性weight,相当于__init__函数也重写了