zoukankan      html  css  js  c++  java
  • python 类与类之间的关系

    一、依赖关系(紧密程度最低)

      (1)简单的定义:就是方法中传递一个对象。此时类与类之间存在依赖关系,此关系比较低。

      (2)实例植物大战僵尸简易版

        题目要求:创建一个植物,创建一个僵尸

            1、植物:名字、血量,攻击力

            2、僵尸:名字、血量、攻击力

            3、植物可以打僵尸,僵尸掉血

            4、植物被僵尸咬,植物掉血      

    # 植物大战僵尸简易版
    class ZhiWu:#创建植物类
        def __init__(self,name,hp,attack):#初始化属性
            self.name=name
            self.hp=hp
            self.attack=attack
        def da(self,js):
            js.hp-=self.attack
    
    class JiangShi:#创建僵尸类
        def __init__(self,name,hp,attack):#初始化属性
            self.name=name
            self.hp=hp
            self.attack=attack
        def eat(self,zw):
            zw.hp -= self.attack
    # 创建僵尸和植物对象
    zw=ZhiWu("紫罗兰",20,10)
    js=JiangShi("躺尸",30,5)
    # 植物攻击一次
    zw.da(js)
    print(js.hp)#20
    # 僵尸攻击一次
    js.eat(zw)
    print(zw.hp)#15

    二、关联关系(组合、聚合)

      1、简单的定义:两种事物必须是相互关联的,在某种特殊情况下是可以更改和更换的 。

      2、聚合关系:属于关联关系中的特例,重点是xx和xx聚合成的xxx。各个零部件也可以单独工作。

      3、组合关系:组合关系是比较紧密的一种关系,一损俱损。

      4、常见格式(一对一或者一对多模式)    

    def __init__(self,name,xxxlist=None);
        self.name=name
        self.xxxlist=xxxlist
    
    def __init__(self,name,teacher=None):
        self.teacher=tercher

      5、实例:老师和学生模型(老师对学生是一对多,学生对老师是一对一)

    # 创建老师类 老师能选学生
    class Teacher:
        def __init__(self,name,stu_lst=None):
            self.name=name
            if stu_lst:# 判断传递过来的参数是否是空
                self.stu_lst=stu_lst
            else:
                self.stu_lst=[]
        def tianjia(self,stu):#添加学生功能
            self.stu_lst.append(stu.name)
        def display(self):#显示老师对应的学生
            for i in self.stu_lst:
                print(i,end=",")
    # 创建学生类
    class Student:
        def __init__(self,num,name,teacher=None):
            self.num=num
            self.name=name
            self.techer=teacher
    # 创建1个老师,5个学生
    t=Teacher("黄日中")
    s1=Student(1,"郭德纲")
    s2=Student(2,"岳云鹏")
    s3=Student(3,"张杰")
    s4=Student(4,"谢啦")
    s5=Student(5,"沈腾")
    # 添加学生
    t.tianjia(s1)
    t.tianjia(s2)
    t.tianjia(s3)
    t.tianjia(s4)
    t.tianjia(s5)
    # 显示老师学生列表
    t.display()#郭德纲,岳云鹏,张杰,谢啦,沈腾,

    三、简单的继承

      核心self:谁调用,self就是谁。

    class Base:
        def __init__(self, num):
            self.num = num
    
        def func1(self):
            print(self.num)
            self.func2()
    
        def func2(self):
            print(111, self.num)
    
    class Foo(Base):继承
        def func2(self):
            print(222, self.num)
    
    lst = [Base(1), Base(2), Foo(3)]
    for obj in lst:
        obj.func2()
    
    #结果111 1 111 2 222 3
    class UserInfo(object):
        pass
    
    class Department(object):
        pass
    
    class StarkConfig(object):
        def __init__(self, num):
            self.num = num
        def changelist(self, request):
            print(self.num, request)
        def run(self):
            self.changelist(999)
    
    class RoleConfig(StarkConfig): #继承 StarkConfig
        def changelist(self, request):
            print(666, self.num)
    
    class AdminSite(object):
        def __init__(self):
            self._registry = {} #空字典
        def register(self, k, v):
            self._registry[k] = v(k)
    
    
    site = AdminSite()
    site.register(UserInfo, StarkConfig)
    site.register(Department, RoleConfig)
    # site._registry{UserInfo:StarkConfig(UserInfo),Department:RoleConfig(Department)}
    for k, row in site._registry.items():
        row.run()
    # UserInfo,999 666,Department

    四、类里面的特殊成员

      1、类名() 会自动执行__new__(cls,*args,**kwargs)  创建对象,开辟内存

      2、类名()会自动执行__init__(self)  对象初始化

      3、对象()会自动执行__call__( )

      4、对象[key]会自动执行__getitem__( )

      5、对象[k]=value 会自动执行 __setitem__( )

      6、del 对象[key] 会自动执行 __delitem__( )

      7、对象+对象 会自动执行 __add__( )

      8、with 对象 as 变量 会自动执行 __enter__( )和__exit__( )

      9、干掉hash __hash__ ==None  对象就不可以hash

      10、对象可以迭代  __iter__( )

      

      

            

      

  • 相关阅读:
    android 开发-自定义多节点进度条显示
    android开发 ,对接支付宝,服务器(PHP)校验失败
    android开发支付宝接口开发流程(密钥篇)
    android开发 解决启动页空白或黑屏问题
    关于的 recorder robotium 的Eclipse插件(URL:http://recorder.robotium.com/updates/或者说不可用)
    git android.google 源码:Unknown SSL protocol error in connection to code.google.com:443
    解决方案:android monkeyrunner:Timeout while trying to create chimp mananger(device = MonkeyRunner.waitForConnection()一直报错的问题)
    JasperReport学习札记6-JRXML的标签
    SQL Server 的动态语句(SQLServer 的String.format用法)(SQLServer的调用SQL占位符的使用)
    IReport5.6.0创建数据库连接找不到驱动(iReport中ClassNotFoundError错误的解决)
  • 原文地址:https://www.cnblogs.com/angle6-liu/p/9936483.html
Copyright © 2011-2022 走看看