python基础day-19:面向对象编程

python基础day-17:面向对象基础
python基础day-18:面向对象进阶

面向对象的四大支柱

抽象(abstraction)

定义类需要做数据抽象和行为抽象

封装(encapsulation)

将数据和操作数据的方法绑定到一起

将实现细节隐藏,暴露简单的调用接口

继承(inheritance)

多态(polymorphism)

对象接收到相同的消息,但表现出不同的行为

 

 

  1. 抽象类

    • 不能创建对象的类,不能实例化
    • 专门用来让其它类来继承
  2. 元类(meta-class)

    • 描述类的类
    • 类本身也是对象,该对象由元类创建
    • 元数据:描述数据的数据
  3. 继承(inheritance)

    • 从已有的类创建新类的过程
    • 提供继承信息的称为父类(基类)
    • 得到继承的信息称为子类(派生类)
  4. 多态(polymorphism)

    • 子类在继承父类的过程中,可以对父类已有的方法进行重写(override)
    • 不同的子类可以给出不同的实现版本,那么这个方法在运行时就会表现出多态行为
from abc import ABCMeta, abstractmethod
# abstract class
import random
import string

class Employee(metaclass=ABCMeta):
    
    def __init__(self, name):
        self.name = name
        
    @abstractmethod
    def get_salary(self):
        pass
        
class Manager(Employee):
    
    def get_salary(self):
        return 15000
    
    
class Programmer(Employee):
    
    def __init__(self, name):
        self.name = name
        self.working_hour = 0
        
    def get_salary(self):
        return 200 * self.working_hour
    

class Salesman(Employee):
    
    def __init__(self, name):
        self.name = name
        self.sales = 0
        
    def get_salary(self):
        return 2000 + self.sales * 0.03
        
emps = [
    Manager('xiaobai'),
    Programmer('xiaohua'), Programmer('xianghuang'),
    Salesman('xiaozhang'), Salesman('xiaoli'),
]

for emp in emps:
    if isinstance(emp, Programmer):
        emp.working_hour = int(input(f'{emp.name}本月工作时间:'))
    elif isinstance(emp, Salesman):
        emp.sales = int(input(f'{emp.name}本月销售额:'))
        
    # get_salay 方法是被子类重写过的方法,会表现出多态行为
    print(f'{emp.name}本月工资:{emp.get_salary()}元')
    
import random
def get_captcha(*, length=6):
    return ''.join(random.choices(string.digits+string.ascii_letters, k=length))

get_captcha(length=4)

你可能感兴趣的:(python基础,多态,python,类)