Python OOP:面向对象三大特性(封装、继承、多态)、类属性和实例属性、类方法@classmethod、静态方法@staticmethod

一、面向对象三大特性

在这里插入图片描述

二、多态

在这里插入图片描述
定义:多态是⼀种使⽤对象的⽅式,⼦类重写⽗类⽅法,调⽤不同⼦类对象的相同⽗类⽅法,可以产⽣不同的执⾏结果。

一个父类,可以继承给多个子类,每个不同的子类可以创建多个对象,每个对象可以调用父类之父类的方法,产生不同的执行结果。

# 犬与人协同工作,人协同不同的犬执行不同的任务
class Dog:
    def work(self):   # ⽗类提供统⼀的⽅法,哪怕是空⽅法
        print("指哪打哪")

class ArmyDog(Dog):  # 继承Dog类
    def work(self):  # ⼦类重写⽗类同名⽅法
        print("追击敌人")

class DrugDog(Dog):
    def work(self):  # ⼦类重写⽗类同名⽅法
        print("追查毒品")

class Person:
    def work_with_dog(self, dogtype):  # 传⼊不同的对象,执⾏不同的代码,即不同的work函数
        dogtype.work()

ad = ArmyDog()
dd = DrugDog()
p1 = Person()

ad.work()  # 追击敌人
p1.work_with_dog(ad)  # 追击敌人
p1.work_with_dog(dd)  # 追查毒品

三、设置和访问类属性

- 类属性就是类对象所拥有的属性,类属性被该类的所有实例对象所共有

- 类属性可以用类对象访问,也可以用实例对象访问。
在这里插入图片描述

class Dog:
    age = 3

wangcai = Dog()
xiaohei = Dog()

print(Dog.age)  # 通过类访问类属性
print(wangcai.age)  # 通过对象访问类属性
print(xiaohei.age)  # 通过对象访问类属性

输出:
3
3
3

四、修改类属性

类属性只能通过类对象修改,不能通过实例对象修改,如果通过实例对象修改类属性,表示的是创建了⼀个实例属性。

class Dog:
    age = 3

wangcai = Dog()
xiaohei = Dog()

Dog.age = 10  # 通过类修改类属性
print(Dog.age)  # 10 通过类访问类属性
print(wangcai.age)  # 10 通过对象访问类属性
print(xiaohei.age)  # 10 通过对象访问类属性
class Dog:
    age = 3

wangcai = Dog()
xiaohei = Dog()

wangcai.age = 20  # 通过对象修改类属性,实际并未修改类属性,而是创建了一个同名实例属性
print(Dog.age)  # 3 通过类访问类属性
print(wangcai.age)  # 20 通过对象访问类属性
print(xiaohei.age)  # 3 通过对象访问类属性

五、实例属性

实例属性不能通过类访问。

  • 每个对象的每个属性都会单独占用一份内存空间,如果定义大量实例属性,会耗费内存。
  • 对一些数值不会变化的属性,可以定义为类属性,类属性共享一份内存,可以减少内存消耗。
  • 如果连参数传递都不需要,可以定义静态方法,更加减少内存消耗。
class Dog:
    def __init__(self):
        self.age = 5

    def printinfo(self):
        print(self.age)
        
wangcai = Dog()
print(wangcai.age)  # 对象访问实例属性
wangcai.printinfo()  # 对象访问实例方法
print(Dog.age)  # 报错:实例属性不能通过类访问

在这里插入图片描述

六、类方法

1、类⽅法特点

  • 第⼀个形参是类对象的⽅法
  • 需要⽤装饰器 @classmethod 标识其为类⽅法,对于类⽅法,第⼀个参数必须是类对象,⼀般以cls 作为第⼀个参数,cls代表这个类。

@classmethod,标识某一个函数为类方法
`

2、类方法使用场景

  • 方法中需要使用类对象时 (如访问私有类属性等),定义类⽅法
  • 类方法⼀般和类属性配合使⽤
class Dog:
    __age = 3  #  添加私有类属性,两道下划线.属性名=属性值

    @classmethod    # 定义类方法
    def get_age(cls):  # 形参cls代表Dog类(在实例属性里用形参self代表实例对象)
        return cls.__age  # 访问类属性的值
    
wangcai = Dog()
result = wangcai.get_age()  # 对象调用类方法
print(result)  # 3
print(Dog.get_age())  # 3 类调用类方法

七、静态方法

1、静态方法的特点

  • 需要通过装饰器 @staticmethod来进⾏修饰,静态方法既不需要传递类对象也不需要传递实例对象(形参没有self/cls)
  • 静态方法既可以使用对象访问又可以使用类访问

2、静态方法使用场景

  • 当⽅法中 既不需要使⽤实例对象(如实例对象,实例属性),也不需要使⽤类对象 (如类属性、类⽅法、创建实例等)时,可以定义静态⽅法
  • 取消不需要的参数传递,有利于减少不必要的内存占用和性能消耗
class Dog:
    @staticmethod
    def printinfo():
        print("这是一个犬类,用于创建犬实例……")

wangcai = Dog()
wangcai.printinfo()  # 通过对象调用类方法
Dog.printinfo()  # 通过类调用类方法

输出:
这是一个犬类,用于创建犬实例……
这是一个犬类,用于创建犬实例……

八、小结

在这里插入图片描述

PS: source,itheima

猜你喜欢

转载自blog.csdn.net/weixin_47008635/article/details/114748867