当前位置: 移动技术网 > IT编程>脚本编程>Python > Python进阶编程 类与类的关系

Python进阶编程 类与类的关系

2019年08月07日  | 移动技术网IT编程  | 我要评论

名侦探柯南特别版,合肥仪表,小品女神和女汉子

类与类的关系

依赖关系

# 依赖关系: 将一个类的类名或者对象传给另一个类的方法中.
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操作 ......
--------------------- 

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网