类
一、类属性和类方法
创建类:关键字class 类名首字母大写
创建实例对象 类名()
调用类属性:实例对象.属性名
调用类方法:实例对象.方法名
类方法中:self是固定的占坑符号,类里面的方法都必须带self
class Boyfrind():
# 类属性
height=175
weight=130
# 类方法
def cooking(self): #self 固定的占坑符合 类里面的方法都必须带self这个参数 self代表实例本身
print("会做饭")
def earn(self):
print("会挣钱")
@classmethod
def swimming(cls):
print("还要会游泳")
@staticmethod
def sing():
print("会唱歌")
# 创建实例并调用
bf=Boyfrind()
print("————————实例方法——————————")
print(bf.height) # 调用类属性
bf.cooking() #调用类方法
# 类方法 @classmethod
# 类方法调用一:
print("————————类方法——————————")
Boyfrind.swimming()
# 类方法调用二:
bf.swimming()
# 静态方法的调用
# 静态方法调用一:
print("————————静态方法——————————")
Boyfrind.sing()
# 静态方法调用二:
bf.sing()
运行结果:
————————实例方法——————————
175
会做饭
————————类方法——————————
还要会游泳
还要会游泳
————————静态方法——————————
会唱歌
会唱歌
实例拥有使用类里面的所有属性和方法的权限
二、类方法的分类
类里面的方法分为三种:
(1) 实例方法:意味着这个方法只能实例调用
bf=Boyfrind()
bf.cooking() #隐式调用
Boyfrind.cooking(bf) #显示调用
(2) 类方法:方法前面必须加 @classmethod (可参考上诉代码)
方式一:Boyfrind.swimming()
方式二:bf.swimming()
(3) 静态方法: 方法前面必须加@staticmethod (可参考上诉代码)
方式一:Boyfrind.sing()
方式二:bf.sing()
实例方法、类方法、静态方法总结
1:实例方法 self 类方法 cls 静态方法(普通方法) 实例和类名都可以直接调用
2:不同点 静态方法和类方法 不可以调用类里面的属性值 如果你要参数 需要自己进行传参
3:什么时候去定义静态和类方法 当你的某个函数与其他的类函数 没有半毛钱关系 就可以定义静态方法和类方法
三、初始化函数 init
class LemonTeacher:
def __init__(self,name,age): # 初始化函数 __init__,没有return值
self.name=name
self.age=age
# 没有return
def info(self):
print(self.name+"今年"+self.age+"岁")
def coding(self,*args):
self.cooking(*args)
print(self.name+"会敲代码")
def cooking(self,*args):
for item in args:
print("会做{0}".format(item))
t_2=LemonTeacher("毛毛","20")
t_2.coding("蛋炒饭","蔬菜沙拉")
运行结果:
会做蛋炒饭
会做蔬菜沙拉
毛毛会敲代码
四、类的继承
1 父类有的 继承后 都可以直接拿过来用
2 父类有 子类也有重名的 那么子类的实例就优先调用子类的函数
# 继承
class RobotOne:#第一代机器人
def __init__(self,name,year=None):
self.year=year
self.name=name
def walking_on_ground(self):
print(self.name+"只能在平地上行走,有障碍物就会摔倒")
def robot_info(self):
print("{0}年产生的机器人{1},是中国研发的".format(self.year,self.name))
class RobotTwo(RobotOne): # 第二代机器人继承于第一代机器人的类
def walking_on_ground(self): # 子类里面的函数名与父类里面的函数名一样 就叫重写
print(self.name+"可以在平地上行走")
def walking_avoid_block(self): #拓展
# 我想在子类的函数里面调用父类的一个函数
self.robot_info()
print(self.name+"可以避开障碍物")
r_2=RobotTwo("2018","华华")
r_2.robot_info()
r_2.walking_on_ground()
r_2.walking_avoid_block()
运行结果:
华华年产生的机器人2018,是中国研发的
2018可以在平地上行走
华华年产生的机器人2018,是中国研发的
2018可以避开障碍物
五、类的多继承
多继承 具有两个父类的属性和方法 如果两个父类具有同名方法的时候 就近原则
初始化函数也包含在内
# 继承
class RobotOne:#第一代机器人
def __init__(self,name,year=None):
self.year=year
self.name=name
def walking_on_ground(self):
print(self.name+"只能在平地上行走,有障碍物就会摔倒")
def robot_info(self):
print("{0}年产生的机器人{1},是中国研发的".format(self.year,self.name))
class RobotTwo(): # 第二代机器人继承于第一代机器人的类
def __init__(self,name,year):
self.name=name
self.year=year
def walking_on_ground(self): # 子类里面的函数名与父类里面的函数名一样 就叫重写
print(self.name+"可以在平地上行走")
def walking_avoid_block(self): #拓展
# 我想在子类的函数里面调用父类的一个函数
self.robot_info()
print(self.name+"可以避开障碍物")
# 多继承
class RobotThree(RobotTwo,RobotOne): #第三代机器人 继承第二代机器人、第一代机器人
def jump(self):
print(self.name+"可以单膝跳跃")
r_3=RobotThree("大王","2010")
r_3.jump()
r_3.walking_on_ground()
r_3.walking_avoid_block()
运行结果:
大王可以单膝跳跃
大王可以在平地上行走
2010年产生的机器人大王,是中国研发的
大王可以避开障碍物
六、超继承 super()
super() 函数是用于调用父类(超类)的一个方法。
# 超继承
class MathMethod:
def __init__(self,a,b):
self.a=a
self.b=b
def add(self):
print("我是父类中的方法",self.a+self.b)
def sub(self):
print( self.a-self.b)
class MathMethod_1(MathMethod): #继承MathMethod
def divide(self):# 拓展
print(self.a/self.b)
def add(self): # 重写
super(MathMethod_1,self).add() #超继承:想用父类的方法 又不想重新写
print("我是子类中的方法",self.a+self.b+10)
MathMethod_1(5,6).add()
MathMethod_1(5,6).sub()
运行结果:
我是父类中的方法 11
我是子类中的方法 21
-1