HSP_14章 Python_Class对象和静态方法_抽象类

P133 Class对象和静态方法

1. Class对象

1.1 基本介绍

1) 文档: https://docs.python.org/zh-cn/3.12/tutorial/classes.html#class-objects
2) 类本身也是对象,即class对象

1.2 应用实例

class Monster:
    name = "蝎子精"
    age = 300

    def hi(self):
        print(f'hi(){self.name}-{self.age}')


# 下一个断点,可以看到 Monster的情况
print(Monster)

# 通过Class对象,可以引用属性(没有创建实例对象也可以引用1访问)
print(f"Monster.name:{Monster.name} Monster.age:{Monster.age}")

# 通过类型如何调用非静态成员方法
Monster.hi(Monster)
print("*" * 32)

2. 静态方法

2.1 基本介绍

1) 文档: https://docs.python.org/zh-cn/3.12/library/functions.html#staticmethod
2) @staticmethod 将方法转换为静态方法
3) 静态方法不回接受隐式的第一个参数,要声明一个静态方法,语法: 

class C:
@staticmethod
def f(arg1,arg2,argN): ...
4) 静态方法既可以由类调用(如C.f()),也可以由实例中调用(如C().f())

2.2 应用介绍

class Monster:

    name ="揭子精"
    age = 300

    def hi(self):
        print(f'hi() {self.name}-{self.age}')

    @staticmethod
    def ok():
        print("ok()...")

#不需要实例化,通过类即可调用静态方法
Monster.ok()
# 通过实例对象,也可以调用静态方法#
monster = Monster()
monster.ok()

P134 抽象类

1.问题引出

在这里插入图片描述

2.快速入门

在这里插入图片描述

from abc import ABC, abstractmethod

# Animal此时就是抽象类
class Animal(ABC):
    # name = None
    # age = None
    # gender = None

    def __init__(self, name, age):
        self.name = name
        self.age = age

    @abstractmethod
    def cry(self):
        pass
        # 动物都有叫唤的行为...但是这个行为不明确(即不能明确的实现..)
        # : return:
        # print("不知道是什么动物,不知道是什么叫声...)



# 编写子类Tiger 继承Animal 并实现抽象方法
class Tiger(Animal):
    def cry(self):
            print(f"牢虎{self.name} 嗷嗷叫...")

# 注意: 抽象类(含有抽象方法),不能实例化
# TypeError: Can't instantiate abstract class Animal with abstract method cry
# animal = Animal("动物",3)
tiger = Tiger("毛毛",10)
tiger.cry()

P135 抽象类的注意事项和细节

1. 注意事项和使用细节

  1. 抽象类不能被实例化
  1. 抽象类需要继承ABC,并且需要至少一个抽象方法
  • 代码演示
from abc import ABC, abstractmethod

# Animal此时就是抽象类
class AAA(ABC):
    name = "tim"


    @abstractmethod
    def f1(self):
        pass

obj1 = AAA()
print("ok")

  1. 抽象类可以有普通方法
from abc import ABC, abstractmethod

# Animal此时就是抽象类
class AAA(ABC):
    name = "tim"

    @abstractmethod
    def f1(self):
        pass

    def hi(self):
        print("hi()~~")

    def ok(self):
        pass
class BBB(AAA):
    # 实现父类的f1抽象方法
    def f1(self):
        print("BBB - f1()...")

obj2 = BBB()
obj2.ok()
obj2.f1()
obj2.hi()
print("~~")

  1. 如果一个类继承了抽象类,则它必须实现抽象类的所有抽象方法,否则它仍然是一个抽象类
from abc import ABC, abstractmethod

class AAA(ABC):
    name = "tim"

    @abstractmethod
    def f1(self):
        pass

    @abstractmethod
    def f2(self):
        pass

    def hi(self):
        print("hi()~~")

    def ok(self):
        pass
class BBB(AAA):
    # 实现父类的f1抽象方法
    def f1(self):
        print("BBB - f1()...")
    # ,如果没有完全实现AAA的抽象方法, BBB仍然是一个抽象类
    # 会报错 TypeError: Can't instantiate abstract class BBB with abstract method f2
    def f2(self):
        print("BBB - f2()...")

obj2 = BBB()
obj2.ok()
obj2.f1()
obj2.hi()
print("~~")
  • 练习题
#1)编写一个Employee类,做成抽象基类,包含如下三个属性:name,id,salary,#提供必要的构造器和抽象方法:work)
#2)对于anager类来说,他既是员工,还具有奖金(bonus)的属性
# 请使用继承的思想,设计CommonEmployee类和anager类,要求实现work()
# 提示“经理普通员工名字工作中
#00P继承+抽象类3min

from abc import ABC, abstractmethod

class Employee(ABC):
    name = "tim"
    id = None
    salary = None
    def __init__(self,name,id,salary):
        self.name = name
        self.id = id
        self.salary = salary

    @abstractmethod
    def work(self):
        pass


class CommonEmployee(Employee):

    def work(self):
        print(f"普通员工{self.name} 正在工作中...")


class Manager(Employee):
    bonus = None

    def __init__(self, name, id, salary,bonus):
        super().__init__(name, id, salary)
        self.bonus = bonus

    def work(self):
        print(f"经理{self.name} 正在工作中...")

com = CommonEmployee("小张",10,2000)
com.work()

mana = Manager("王总",1,20000,120000)
mana.work()
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

pigerr杨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值