Python之多态

# 1、多态:同一种事务的多种形态
# 不关注对象的类型,关注对象的具有的行为
# 不同的子类对象,调用相同的方法,会产生不同的结果

'''
“需求”:警务人员和警犬一起工作,警犬分2种:追击敌人和追查毒品,警务人员携带不同的警犬,执行不同的工作。

“实现步骤”:1.  定义父类,并提供公共方法。
			  2.  定义子类,并重写父类方法。
			  3.  传递子类对象给调用者,可以看到不同子类执行效果不同。
'''
# 1、定义父类,并提供公共方法
class Dog(object):
    def work(self):
        pass

# 2、定义子类,并重写父类方法
# 追击敌人警犬类
class ArmyDog(object):
    def work(self):
        print('追击敌人')

# 追查毒品
class DrugDog(object):
    def work(self):
        print('追查毒品')

# 警务人员
class Person(object):
    # 警务人员携带不同的警犬,执行不同的工作
    def work_with_dog(self, dog):
        dog.work()


# 3.传递子类对象给调用者,可以看到不同子类执行效果不同。
Ustinian = Person()
ad = ArmyDog()
dd = DrugDog()
Ustinian.work_with_dog(ad)  # 传入不同的对象,执行不同的结果
Ustinian.work_with_dog(dd)
# ad.work()
# dd.work()

# 多态的作用:让具有不同功能的函数可以使用相同的函数名,这样就可以用一个函数名调用不同的(功能)函数

# 静态方法:方法内部,不需要访问实例属性和类属性,如果要访问类属性只能通过类名.属性名访问,不能访问实例属性
class Dog(object):

    @staticmethod # 静态方法:类中的函数,不需要实例
    def run(name):
        print(f'{name}狗狗在跑步')


# 注意:静态方法的调用既可以使用类名,也可以使用类对象
# 使用类名
Dog.run('叮叮')
# 使用类对象
# dog = Dog('dd') # 报错,Dog里面没有参数
dog = Dog()
dog.run('咚咚')


# 类方法:方法内部只需要访问类属性,可以通过cls.属性名访问类属性
class Cat(object):  # 猫类
    name = '汤姆'  # 定义类属性

    @classmethod
    def sleep(cls):  # 类方法
        print('类方法中的cls:', cls)  # cls表示类对象
        # 调用类属性,cls.类属性
        print(f'{cls.name}猫在睡觉')

print('打印类:', Cat)
# 使用类名直接调用类方法
Cat.sleep()

# 使用类对象调用类方法
cat = Cat()
cat.sleep()


# 实例方法:方法内部可以通过类名\self.类属性名来访问类属性,方法内部访问实例属性,但是不能通过类名去访问实例属性
class Person(object):
    name = 'Ustinian'
    def __init__(self):
        self.age = 18  # 实例属性

    def eat(self):
        # 在实例方法中访问类属性\实例属性
        print(f'{self.name}在吃')
        # 类名.属性名
        print(f'{Person.name}在吃')
        print(f'年龄是:{self.age}')
        # 不能通过类名去访问实例属性

p1 = Person()
p1.eat()


'''
“需求”:将小于房子剩余面积的家具摆放到房子中
“分析”:需求涉及两个事物: 房子和家具
“步骤”:1. 定义房子类,在类中确定房子的属性和方法
	   2. 定义家具类,在类中确定家具的属性和方法
	   3. 实现房子添加家具的功能方法	
'''

'''
题目分析:
    1、需求涉及两个事物,房子和家具  房子和家具类
    1.1 房子类
        1、实例属性  初始化方法
            地理位置
            房屋面积
            剩余面积
            房屋家具名称列表
        
        2、实例方法
            容纳家具的方法
        
        3、显示房屋具体信息 __str__ 展现对象的描述信息
    
    1.2 家具类
        1、实例属性  初始化方法
            家具的名称
            家具的占地面积
            
'''
# 1、房子类
class Home(object):
    # 1.1实例属性 初始化方法
    def __init__(self, address, area):
        # 地理位置
        self.address = address
        # 房屋面积
        self.area = area
        # 剩余面积 = 房屋面积-家具面积   由于还没有添加家具
        self.free_area = area
        # 房屋家具名称列表
        self.list_furniture = []

    # 容纳家具的方法
    def add_furniture(self, furniture):  # self实例化对象本身,furniture传入的实例化家具对象
        # 判断家具的面积  剩余面积 >= 家具的面积
        if self.free_area >= furniture.f_area:
            # 将家具名称使用append方法添加到家具列表
            self.list_furniture.append(furniture.name)
            # 房屋剩余面积 - 家具面积 = 房屋剩余面积
            self.free_area -= furniture.f_area
        else:
            print(f'{furniture.name}面积过大无法添加')

    # 1.3 显示房屋具体信息 __str__
    def __str__(self):
        return f'房屋坐落在{self.address},占地面积:{self.area},剩余面积:{self.free_area},家具有{self.list_furniture}'


# 2、家具类
class Furniture(object):
    # 实例属性  初始化方法
    def __init__(self, name, f_area):
        # 家具的名称
        self.name = name
        # 家具的占地面积
        self.f_area = f_area

# 实例化对象
jia = Home('长沙', 40)
# print(jia)

# 实例化家具对象
bed = Furniture('双人床',6)
TV = Furniture('电视机', 4)
sofa = Furniture('沙发', 34)

# 调用添加家具的方法
jia.add_furniture(bed)
jia.add_furniture(TV)
jia.add_furniture(sofa)
print(jia)

你可能感兴趣的:(python,开发语言,后端)