zoukankan      html  css  js  c++  java
  • 第十七天-面向对象03-类与类的关系

    # 依赖关系
    # 在方法中给方法传递一个对象,把对象当成参数调用,此时类与类之间的关系是最弱的
     1 # 大象装冰箱
     2 class Elephant:
     3     def open(self,bx):  # 这里要放一个bx 依赖关系
     4         print("大象高高兴兴走到了冰箱面前")
     5         bx.kai()
     6 
     7     def zhuang(self):
     8         print("自己走进了冰箱")
     9 
    10     def close(self,bx): # 这里要放一个bx 依赖关系
    11         print("大象自己关闭了冰箱门")
    12         bx.guan()
    13 
    14 class Ice:
    15     def kai(self):
    16         print("我是冰箱,我开门了")
    17     def guan(self):
    18         print("我是冰箱,我关门了")
    19 
    20 bx1 = Ice()
    21 dx = Elephant()
    22 dx.open(bx1) # 这里把bx1作为一个参数传递进去了 也就是 大象可指定任何一冰箱
    23 dx.zhuang()
    24 dx.close(bx1)
    # 植物大战僵尸
     1 class Jiangs:
     2     @classmethod
     3     def zd(cls):
     4         print("战斗开始!")
     5 
     6     def __init__(self,name,hp,power):
     7         self.name = name
     8         self.hp  = hp
     9         self.power = power
    10 
    11     def chi(self,zw): # 把zw对象作为一个参数给chi调用
    12         zw.hp -= self.power
    13         print("%s对%s造成了%s伤害"%(self.name,zw.name,self.power))
    14         print("%s还有%s血"%(zw.name,zw.hp))
    15 
    16 class Zhiw:
    17     def __init__(self,name,power,hp):
    18         self.name = name
    19         self.power = power
    20         self.hp = hp
    21 
    22     def da(self,js): # 把js对象作为一个参数给da调用
    23         js.hp -= self.power
    24         print("%s对%s造成了%s伤害" % (self.name, js.name, self.power))
    25         print("%s还有%s血" % (js.name,js.hp))
    26 
    27 
    28 zw1 = Zhiw("豌豆战士",50,300)
    29 js1 = Jiangs("看报僵尸",1000,30)
    30 
    31 # Jiangs.zd()
    32 # js1.chi(zw1)
    33 # zw1.da(js1)
    34 # js1.chi(zw1)
    35 # zw1.da(js1)
    36 # js1.chi(zw1)
    37 # zw1.da(js1)
    # 关联关系
    # 两种事物必须是相互关联的,但在某些情况是可以更改的
     1 # 男女朋友
     2 class Boy:
     3     def __init__(self,name,girlfriend = None):
     4         self.name = name
     5         self.girlfriend = girlfriend
     6 
     7     def play(self):
     8         if self.girlfriend:
     9             self.girlfriend.happy() # 调用g的方法happy
    10             print("%s和%s在玩游戏"% (self.name,self.girlfriend.name))
    11         else:
    12             print("没女朋友玩什么玩")
    13 
    14 class Girl:
    15     def __init__(self,name):
    16         self.name = name
    17 
    18     def happy(self):
    19         print("有好玩的好开心")
    20 
    21 g = Girl("尼美")
    22 b = Boy("尼玛",g) # g赋值给b对象的girlfriend属性
    23 
    24 # b.play()
    25 # b.girlfriend = None # 突然有天闹掰了
    26 # b.play()
    # 老师和学生的关系,一对多,反过来一对一多对一
     1 class Teacher:
     2     def __init__(self,name,lst=None):
     3         self.name = name
     4         if lst == None: # 判断传递过来的参数是否为空
     5             self.lst = []
     6         else: # 不为空就等于列表
     7             self.lst = lst
     8 
     9     def tianjia(self,student): # 添加学生到列表
    10         self.lst.append(student)
    11 
    12     def display(self): # 输出学生 s
    13         for s in self.lst:
    14             print(s.name)
    15 
    16 
    17 class Student:
    18     def __init__(self,num,name,teacher=None):
    19         self.name = name
    20         self.num = num
    21         self.teacher = teacher
    22 
    23 
    24 t = Teacher("小苍")
    25 s1 = Student(1,"大张伟")
    26 s2 = Student(2,"郭德纲")
    27 s3 = Student(3,"岳云鹏")
    28 s4 = Student(4,"薛之谦")
    29 
    30 # t.tianjia(s1)
    31 # t.tianjia(s2)
    32 # t.tianjia(s3)
    33 # t.tianjia(s4)
    34 #
    35 # t.display()
    # 聚合关系 代码上写法与关联一样
    # 属于关联关系中的一种特例.不过侧重点是xxx和xxx聚合成xxx.各自有各自的声明
    # 周期.如电脑.电脑里有CPU,硬盘,内存等等.电脑挂了.CPU还是好的.还是完整的个体
    # 如下:
     1 # 各个类组合成电脑类,但分开又能是单独的个体
     2 
     3 class Computer:
     4 
     5     def __init__(self, cpu, memory, yingpan, zhuban, xianshiqi):
     6         pass
     7 
     8 class Cpu:
     9     pass
    10 
    11 class Memory:
    12     pass
    # 组合关系 代码上写法与关联一样
    # 属于关联关系中的一种特例,写法上差不多.组合关系比聚合还紧密.如⼈,
    # 人的大脑,心脏,各个器官.这些器官组合成一个⼈.这时.⼈如果挂了.其他的东西也跟着挂了.

    # 关联关系 一对多,反过来一对一多对一 在如:商城购物、通讯软件等广泛使用



    # 练习 帖子和评论
     1 class Tie:
     2     def __init__(self, title, content, author, time, pinglun_lst = None):
     3         self.title = title
     4         self.content = content
     5         self.author = author
     6         self.time = time
     7         if pinglun_lst == None:
     8             self.pinglun_lst = []
     9         else:
    10             self.pinglun_lst = pinglun_lst
    11 
    12 class Pinglun:
    13     def __init__(self, name, time, content, fav):
    14         self.name = name
    15         self.time = time
    16         self.content = content
    17         self.fav = fav
    18 
    19 
    20 pl1 = Pinglun("UZI", "昨天1", "UZI发出祝福",1888888)
    21 pl2 = Pinglun("xiaohu", "昨天2", "UZI发出祝福",1888888)
    22 pl3 = Pinglun("若风", "昨天3", "UZI发出祝福",1888888)
    23 pl4 = Pinglun("let me", "昨天3", "UZI发出祝福",1888888)
    24 pl5 = Pinglun("长长", "昨天4", "UZI发出祝福",1888888)
    25 pl6 = Pinglun("jackylove", "昨天5", "UZI发出祝福",1888888)
    26 pl7 = Pinglun("mlxg", "昨天6", "UZI发出祝福",1888888)
    27 pl8 = Pinglun("miss", "昨天7", "UZI发出祝福",1888888)
    28 
    29 # 添加评论到列表
    30 lst = []
    31 lst.append(pl1)
    32 lst.append(pl2)
    33 lst.append(pl3)
    34 lst.append(pl4)
    35 lst.append(pl5)
    36 lst.append(pl6)
    37 lst.append(pl7)
    38 lst.append(pl8)
    39 
    40 # 显示帖子的内容.评论内容
    41 tie = Tie("S8_IG夺冠. 王思聪怒吃热狗. ", "IG的上单The Shy疯了一样. 一个打5个. 自己人都不放过", "王明","某年某月某一天",lst )
    42 print(tie.content)
    43 
    44 # 评论
    45 # print(tie.pinglun_lst)  # 直接打印一堆内存地址
    46 
    47 for pl in tie.pinglun_lst:  # 循环去拿出每条评论
    48     print(pl.content)  # 打印 pl.content 评论内容
    # 继承关系之self
    '''
    在面向对象的世界中存在着继承关系.现实中也存在着这样的关系.我们说过.x是一种y,那x就可以继承y.这时理解层面上的.如果
    上升到代码层面.我们可认为.子类在不影响父类的程序运行的基础上对父类进行的扩充和扩展.这里.我们可把父类称为超类或者基类.子类被称为派生类.
    '''
     1 # 类名和对象默认是可以作为字典的key的
     2 class Foo:
     3     def __init__(self):
     4         pass
     5 
     6     def method(self):
     7         pass
     8 
     9     # __hash__ = None  # 该类的对象就不可哈希了
    10 
    11 print(hash(Foo))  # 类 可hash(不可改变)的
    12 print(hash(Foo())) # 对象 可hash的
    13 # 可哈希 所以字典的key可以是对象或者类
    14 dic = {}
    15 dic[Foo] = 123
    16 dic[Foo()] = 456
    17 # print(dic)  # 打印如下 是可用的
    18 # {<class '__main__.Foo'>: 123, <__main__.Foo object at 0x000002BC7568EBE0>: 456}
    19 
    20 # dic = {Foo:Foo(),Foo():"疙瘩汤"} # 可用
    21 
    22 # 不可哈希
    23 # list   # unhashable type: 'list'  __hash__ = None
    24 s = []
    25 # print(hash(s))  # list不可哈希

    # 所以想要谁不可哈希 可添加 __hash__ = None
    # 如上面类中添加 __hash__ = None 该类的对象就不可哈希了

    # self 谁调用就是谁的
     1 class Base:
     2     def __init__(self, num):
     3         self.num = num
     4 
     5     def func1(self):
     6         print(self.num)
     7         self.func2()
     8 
     9     def func2(self):
    10         print(111, self.num)
    11 
    12 class Foo(Base):
    13     def func2(self):
    14         print(222, self.num)
    15 
    16 lst = [Base(1), Base(2), Foo(3)]
    17 # for obj in lst:
    18 #     obj.func2()   # 111,1  222,2  222,3
    # self在访问方法的顺序: 永远先找自己的.自己的找不到再找父类的.

    # 类名是变量(类似函数名)
     1 class Car:
     2     def run(self):
     3         print("我的车会跑")
     4 
     5 CarCarCar = Car # 类名是变量
     6 c = CarCarCar()
     7 # c.run()
     8 
     9 # 函数名是变量
    10 def func():
    11     print("我是函数")
    12 
    13 # func()
    14 #
    15 # fn = func
    16 # fn()
    # 特殊成员
    # __init_()就是一个特殊的成员.带双下划线那一堆.这些方法在特殊场景会被自动执行
    '''
    1.类名() 会自动执行__init__()
    2.对象() 会自动执行__call__()
    3.对象[key] 会自动执行__getitem__()
    4.对象[key] = value 会自动执行__setitem__()
    5.del 对象[key] 会自动执行行 __delitem__()
    6.对象+对象 会自动执行 __add__()
    7.with 对象 as 变量会自动执行__enter__ 和__exit__
    8.打印对象的时候 会自动执行 __str__
    9.干掉可哈希 __hash__ == None 对象就不可哈希了.
    10.__repr__() def __repr__(self): 一个对象的官方字符串表示形式
    11.__iter__() 可迭代的
    12.__next__() 获取元素
    13.__new__() 真正的构造方法. 用来创建对象的. 开辟内存
    14.__len__() 返回序列元素个数
    15. < 时自动执行 __lt__() > 时 自动执行 __gt__()
    16. <= 自动执行 __le__() >= 自动执行 __ge__() == 时 执行 __eq__()
    17. __dir__ dir()
    18. __getslice__ 对象[::]
    19. __dict__ 查看当前想的属性
    20. __class__ 指一个对象的类型
    '''



  • 相关阅读:
    mysql-centos7部署mysql5.7.20
    tips-history添加命令的执行时间
    Maven核心概述
    Java动态代理
    JDBC(3)-数据库事务
    JDBC(2)-操作BLOB类型字段和批量插入
    redis+mysql读写方案
    Redis与Memcache区别最全整理【摘自百度】
    redis+mysql有几种用法?【摘录知乎】
    js 拷贝到剪贴板
  • 原文地址:https://www.cnblogs.com/xi1419/p/9932129.html
Copyright © 2011-2022 走看看