Python -- 面向对象:类空间问题以及类之间的关系

Posted agoni-7

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python -- 面向对象:类空间问题以及类之间的关系相关的知识,希望对你有一定的参考价值。

7.2.1 类空间问题

何处可以添加对象属性? -- 对象属性不仅可以在__init__里面添加,还可以在类的其他方法或者类的外面添加

何处可以添加类的静态属性? -- 类的属性不仅可以在类内部添加,还可以在类的外部添加.

对象如何找到类的属性. 图解

技术图片

对象查找属性的顺序: 先从对象空间找 -- > 类空间找 -- > 父类空间找 -->

类名查找属性的顺序: 先从本类空间找 -- > 父类空间找 -- >

上面的顺序都是单向不可逆,类名不能找到对象的属性.

7.2.2 依赖关系

# 举例说明  依赖关系:将一个类的对象或者类名传到另一个类的方法使用。
class Elephant:
    def __init__(self, name):
        self.name = name

    def open(self,ref1):
        print(f'大象self.name默念:打开冰箱门')
        ref1.open_door()

    def close(self,ref2):
        print(f'大象self.name默念:关闭冰箱门')
        ref2.close_door()

class Refrigerator:

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

    def open_door(self):
        print(f"self.name冰箱?被打开了")

    def close_door(self):
        print(f"self.name冰箱?被关上了")

el = Elephant('小白')
ref = Refrigerator('AUX')
el.open(ref)
el.close(ref)

# 执行 Elephant 类方法 实现两个过程 (1.打开冰箱门 2.冰箱门被打开了)

7.2.3 组合关系

# 组合关系: 将一个类的对象封装成另一个类的对象的属性.
# 示例1    男?关联着女朋友. 女?关联着男朋友. 这种关系可以是互相的, 也可以是单??的.
class Boy:
    def __init__(self,name):
        self.name = name

    def meet(self,girl_friend=None):
        self.girl_friend = girl_friend     # self.girl_friend = Girl的对象空间

    def have_dinner(self):
        if self.girl_friend:
            print(f'self.name请self.girl_friend.name一起吃饭')
            self.girl_friend.shopping(self)  # self = Boy 对象空间
        else:
            print('吃狗粮吧')

class Girl:
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def shopping(self,boy):  # boy = Boy 的对象空间
        print(f'self.name和boy.name一起去购物')

wu = Boy('吴超')
G = Girl('如花',48)
wu.meet(G)       # 执行Boy类中的meet方法,将类Girl作为参数传给 girl_friend
wu.have_dinner()


# 示例2  设计一个游戏人物类,让实例化几个对象让这几个游戏人物实现互殴的效果。
class GameRole:
    def __init__(self,name,ad,hp):
        self.name = name
        self.ad = ad
        self.hp = hp

    # def attack(self,p1):
    #     p1.hp = p1.hp - self.ad
    #     print(f'self.name攻击p1.name,p1.name掉了self.ad血,还剩p1.hp血')

    def equit_weapon(self,wea):
        self.weapon = wea      # self.weapon = Weapon 对象空间  这里实现组合关系

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

    def weapon_attack(self,p1,p2):  # p1 = gailun  p2 = zhaoxin
        p2.hp -= self.ad
        print(f'p1.name利用self.name给了p2.name一下,p2.name还剩p2.hp血')

gailun = GameRole('盖伦', 10, 100)
zhaoxin = GameRole('赵信', 20, 90)
great_sword = Weapon('大保健', 30)
gailun.equit_weapon(great_sword)   # 依赖关系: 将Weapon作为参数传给GameRole中的equit_weapon方法的wea
gailun.weapon.weapon_attack(gailun, zhaoxin)

以上是关于Python -- 面向对象:类空间问题以及类之间的关系的主要内容,如果未能解决你的问题,请参考以下文章

python 面向对象专题:类的空间问题类与对象之间的关系类与类之间的关系

python 面向对象专题:类的空间问题类与对象之间的关系类与类之间的关系

Python之面向对象类的空间问题及类之间的关系

Python面向对象

python基础详解

PHP命名空间面向对象以及构造函数