欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Python进阶编程 类与类的关系

程序员文章站 2023-11-30 15:43:04
类与类的关系 依赖关系 组合关系 组合: 将一个类的对象封装成另一个类的对象的属性. 继承关系 继承的优点: 1,增加了类的耦合性(耦合性不宜多,宜精)。 2,减少了重复代码。 3,使得代码更加规范化,合理化 继承:可以分 单继承,多继承 。 单继承 第一种:直接执行 第二种:子类和父类都有相同功能 ......

类与类的关系

依赖关系

# 依赖关系: 将一个类的类名或者对象传给另一个类的方法中.
class elephant:
    def __init__(self, name):
        self.name = name
    def open(self,r1):
        # print(ref1)
        print(f'{self.name}默念三声: 芝麻开门')
        r1.open_door()
    def close(self):
        print('大象默念三声:芝麻关门')
class refrigerator:
    def __init__(self, name):
        self.name = name
    def open_door(self):
        print(f'{self.name}冰箱门被打开了....')
    def close_door(self):
        print('冰箱门被关上了....')
e1=elephant('大象')
r1=refrigerator('海尔冰箱') 
e1.open(r1)     #将一个类的类名或者对象传给另一个类的方法中.产生了依赖关系

组合关系

组合: 将一个类的对象封装成另一个类的对象的属性.

class boy:
    def __init__(self, name):
        self.name = name
    def meet(self, girl_friend=none):
        self.girl_friend = girl_friend  # wu对象空间 : girl_friend : object对象
    def have_diner(self):  # self = wu这个对象空间
        if self.girl_friend:
            print(f'{self.name}请年龄为:{self.girl_friend.age},姓名为{self.girl_friend.name}一起吃六块钱的麻辣烫')
            self.girl_friend.shopping(self)  # (self = wu对象空间)
        else:
            print('单身狗,吃什么吃')
class girl:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    def shopping(self,boy_friend):
        print(f'{boy_friend.name},{self.name}一起去购物!')
wu = boy('吴超')
flower = girl('如花', 48)
# 组合: 将一个类的对象封装成另一个类的对象的属性.
wu.meet(flower)
wu.have_diner()

继承关系

继承的优点:

1,增加了类的耦合性(耦合性不宜多,宜精)。

2,减少了重复代码。

3,使得代码更加规范化,合理化

继承:可以分单继承,多继承

单继承

第一种:直接执行

class aniaml(object):
    type_name = '动物类'

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

    def eat(self):
        print(self)
        print('吃东西')
class person(aniaml):
    pass
p1=person('alex','男','18')
# 实例化对象时必须执行__init__方法,类中没有,从父类找,父类没有,从object类中找
p1.eat()
# 先要执行自己类中的eat方法,自己类没有才能执行父类中的方法。

第二种:子类和父类都有相同功能,都想执行

class aniaml(object):
    type_name = '动物类'
    def __init__(self,name,sex,age):
            self.name = name
            self.age = age
            self.sex = sex

    def eat(self):
        print('吃东西')

class person(aniaml):
    def __init__(self,name,sex,age,mind):
        super().__init__(name,sex,age)  # super.__init__  自动帮你把self 传给父类的__init__
        self.mind = mind

    def eat(self):
        super().eat()
        print('%s 吃饭'%self.name)
  
        
p1 = person('春哥','laddboy',18,'有思想')

多继承

class a:
    pass
class b(a):
    pass
class c(a):
    pass
class d(b, c):
    pass
class e:
    pass
class f(d, e):
    pass
class g(f, d):
    pass
class h:
    pass
class foo(h, g):
    pass

新式类的多继承

mro是一个有序列表l,在类被创建时就计算出来。
通用计算公式为:

mro(child(base1,base2)) = [ child ] + merge( mro(base1), mro(base2), [ base1, base2] )(其中child继承自base1, base2)

如果继承至一个基类:class b(a)
这时b的mro序列为

mro( b ) = mro( b(a) )
= [b] + merge( mro(a) + [a] )
= [b] + merge( [a] + [a] )
= [b,a]

如果继承至多个基类:class b(a1, a2, a3 …)
这时b的mro序列

mro(b) = mro( b(a1, a2, a3 …) )
= [b] + merge( mro(a1), mro(a2), mro(a3) ..., [a1, a2, a3] )
= ...

计算结果为列表,列表中至少有一个元素即类自己,如上述示例[a1,a2,a3]。merge操作是c3算法的核心。

4.2.2. 表头和表尾
表头:
  列表的第一个元素

表尾:
  列表中表头以外的元素集合(可以为空)

示例
  列表:[a, b, c]
  表头是a,表尾是b和c

4.2.3. 列表之间的+操作
+操作:

[a] + [b] = [a, b]
(以下的计算中默认省略)
---------------------

merge操作示例:

如计算merge( [e,o], [c,e,f,o], [c] )
有三个列表 :  ①      ②          ③

1 merge不为空,取出第一个列表列表①的表头e,进行判断                              
   各个列表的表尾分别是[o], [e,f,o],e在这些表尾的集合中,因而跳过当前当前列表
2 取出列表②的表头c,进行判断
   c不在各个列表的集合中,因而将c拿出到merge外,并从所有表头删除
   merge( [e,o], [c,e,f,o], [c]) = [c] + merge( [e,o], [e,f,o] )
3 进行下一次新的merge操作 ......
---------------------