在子类中调用父类的同名方法
在子类中调用父类方法: 一般是用于扩展父类方法
格式:父类名.方法名(self)
class Person(object):
def eat(self):
print('就喜欢吃肉')
class Man(Person):
def eat(self):
# 在子类中调用父类方法
Person.eat(self)
print('我就爱吃海参')
m1 = Man()
m1.eat()
super()的使用
super在python中是代表查询顺序的,也就是用super可以优先查询当前类父类中的属性和方法
格式:
super().方法名(参数)
class Animal(object):
def __init__(self, name, age):
self.name = name
self.age = age
class Dog(Animal):
def __init__(self, name, age, type):
# 在Animal类中只有姓名和年龄,此时我们想增加一个类型属性type,应该怎么做??
# 如果我们只想在原有功能上扩展可以使用super调用父类的init方法,并进行扩展
# self.name = name
# self.age = age
super().__init__(name, age)
self.type = type
d1 = Dog('小狗', 8, '金毛')
print(d1.type)
类方法
类方法: 从属于类的方法,类方法内部第一个参数必须是类, 一般使用cls形参进行接收
格式:
@classmethod
def func1(cls, 参数1, 参数2...):
pass注意: 在类方法中有self么??? 那怎么获取到实例属性和实例方法呢?
我们之前学过先有类后有对象,所以在类方法中还不能调用实例属性和实例方法,如果必须调用改写成实例方法即可类方法的使用场景:
在方法内部,只需要对于类属性和类方法进行调用,而不需要使用到实例属性和实例方法,此时就建议大家使用类方法.类方法在调用时不需要创建对象, 实例方法在调用时必须有对象.
# 吃苹果案例
# 需求: 有一个苹果树, 有若干个苹果, 每个人可以吃苹果,直到把树上的苹果吃完
# 对象: 苹果 属性: 数量(count)
# 对象: 人 方法:吃苹果
class Apple(object):
apple_count = 0
def __init__(self):
Apple.apple_count += 1
class Person(object):
@classmethod
def eat_apple(cls, num):
Apple.apple_count -= num
# 创建对象
a1 = Apple()
a2 = Apple()
a3 = Apple()
a4 = Apple()
Person.eat_apple(2)
print(Apple.apple_count)
静态方法
静态方法和类方法以及实例方法相比使用场景较少,但是调用时要会使用
静态方法可以使用类和实例去调用,但是建议大家使用类调用.
因为此处不依赖于对象,但是如果使用对象调用需要先创建对象
静态方法: 在方法中,不需要使用实例也不需要使用类的情况下,可以将方法写成静态方法
格式:
@staticmethod
def func1(参数1, 参数2....):
pass使用场景: 既没有cls的传入,也没有self的传入,所以在内部就无法使用类和实例. 例如一些类的说明,帮助,非依赖性工具都可以使用静态方法完成.
静态方法和函数最大的区别就是静态方法写在类的内部.
将静态方法写在类的内部好处: 便于调用,便于维护
class Apple(object):
@staticmethod
def print_info():
print('这个类是用来计算苹果数量的')
@staticmethod
def sum_apple(num1, num2):
return num1 + num2
Apple.print_info()
print(Apple.sum_apple(3, 4))