day22_步入百万年薪的第二十二天——从空间角度研究类、类与类之间的关系

day22

从空间角度研究类

何处添加对象属性
  • 在类的______init______可以添加
class Human:
    mind = "有思想的"

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

    def eat(self,argv):
        print("吃饭")
sun = Human("孙宇", 18)
print(sun.__dict__)
  • 在类的方法中也可以添加
class Human:
    mind = "有思想的"

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

    def eat(self):
        self.habby = "女"
        print("吃饭")


sun = Human("孙宇", 18)
sun.eat()
print(sun.__dict__)
  • 在类的外部也可以添加
class Human:
    mind = "有思想的"

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

    def eat(self, argv):
        print("吃饭")


sun = Human("孙宇", 18)
sun.sex = "男"
print(sun.__dict__)
何处添加类的属性
  • 类的内部
class Human:
    mind = "有思想的"

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

    def eat(self, argv):
        Human.body = argv
        print("吃饭")

sun.eat("大脸")
print(Human.__dict__)
  • 类的外部
class Human:
    mind = "有思想的"

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

    def eat(self, argv):
        print("吃饭")

Human.lunguage = "中文"
print(Human.__dict__)
对象空间与类空间的关系

对象空间与类空间有相同的名字,对象肯定先从对象空间查找

查找顺序:

对象. 名字:对象空间 类对象指针 ---> 类空间 ---> 父类空间

类名. 名字:类空间 ---> 父类空间

class Human:
    mind = "有思想的"

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

    def eat(self, argv):
        print("吃饭")
        
sun.mind = "无脑"
print(sun.mind) # 无脑
print(Human.mind) # 有思想的

类与类之间的关系

依赖关系:主从之分

将一个类的类名或者对象传入另一个类的方法

class Elephant:
    def __init__(self, name):
        self.name = name

    def open(self, obj):
        print(f"{self.name} 默念三声:3,2,1 开门")
        obj.be_open()

    def close(self, obj):
        print(f"{self.name} 默念三声“3,2,1 关门")
        obj.be_close()


class Refrigerator:
    def __init__(self, name):
        self.name = name

    def be_open(self):
        print(f"{self.name} 冰箱 被打开了")

    def be_close(self):
        print(f"{self.name} 冰箱 被关闭了")


qiqi = Elephant("qiqi")
haier = Refrigerator("haier")

qiqi.open(haier)  # 主.方法(从)
qiqi.close(haier)

# qiqi 默念三声:3,2,1 开门
# haier 冰箱 被打开了
# qiqi 默念三声“3,2,1 关门
# haier 冰箱 被关闭了
关联关系

与组合相似

class Boy:
    def __init__(self, name, girlfriend=None):
        self.name = name
        self.girlfriend = girlfriend

    def have_a_diner(self):
        if self.girlfriend:
            print(f"{self.name}请他的{self.girlfriend.age}岁的,{self.girlfriend.body}女朋友{self.girlfriend.name}一起吃烛光晚餐")
        else:
            print("吃啥吃")

class Girl:
    def __init__(self, name, age, body):
        self.name = name
        self.age = age
        self.body = body

    def skill(self,obj):
        print(f"{obj.name}的女朋友{self.name} 会用萝莉音直播")


yec = Boy("叶尘")
qiao = Girl("乔碧萝", 53, "小钢炮")
yec.girlfriend = qiao
yec.have_a_diner()
yec.girlfriend.skill(yec)

# qiao = Girl("乔碧萝", 53, "小钢炮")
# yec = Boy("叶尘", qiao)
# yec.have_a_diner()
# yec.girlfriend.skill(yec)
组合关系

组合:将一个类的对象封装到另一个类的对象的属性中,就叫组合。

class GameRole:
    def __init__(self, name, ad, hp):
        self.name = name
        self.ad = ad
        self.hp = hp


class Weapon:
    def __init__(self, name, ad):
        self.name = name
        self.ad = ad

    def weapon_attack(self, p1, p2):   # 依赖关系
        p2.hp = p2.hp - self.ad
        print(f"{p1.name}利用{self.name}给了{p2.name}一下子,{p2.name}掉了{self.ad}血,还剩{p2.hp}血")


gailun = GameRole("盖伦", 15, 800)
xin = GameRole("赵信", 20, 500)
sword = Weapon("大宝剑", 20)
# 盖伦利用大宝剑给赵信一下子
sword.weapon_attack(gailun, xin)

# 1、功能虽然实现了,但是逻辑上不合理,应该是人物对象调用方法.主体
# 2、游戏人物本身就应该绑定武器属性

class GameRole:
    def __init__(self, name, ad, hp):
        self.name = name
        self.ad = ad
        self.hp = hp

    def weapon_swe(self, obj):
        self.weapon = obj   # 组合关系


class Weapon:
    def __init__(self, name, ad):
        self.name = name
        self.ad = ad

    def weapon_attack(self, p1, p2):   # 依赖关系
        p2.hp = p2.hp - self.ad   # self永远默认接收本类实例化对象
        print(f"{p1.name}利用{self.name}给了{p2.name}一下子,{p2.name}掉了{self.ad}血,还剩{p2.hp}血")

        
gailun = GameRole("盖伦", 15, 800)
xin = GameRole("赵信", 20, 500)
sword = Weapon("大宝剑", 20)
# 给游戏人物封装武器属性
gailun.weapon_swe(sword)
gailun.weapon.weapon_attack(gailun, xin)

猜你喜欢

转载自www.cnblogs.com/NiceSnake/p/11305168.html
今日推荐