• python学习 day18 (3月25日)---( 面向对象浅析)


    面向对象思想:

    字典表示对象:

      不是太好 因为 变量 得一个个的赋值改值

    {'name':'alex','blood':20,'attack':1,'sex':''}
    {'name':'太亮','blood':20,'sex':''}
    {'name':'alex','blood':20,'attack':1,'sex':''}

    函数表示面向对象:

      对象赋值

    
    
    #通过两个模子,捏出两个具体的角色
    #抽象 : 只能知道有那些属性  
    #具体 : 可以描述他的属性的值的
    def Person(name,hp,ad,sex):
        dic = {'name':name,'blood':hp,'attack':ad,'sex':sex}
        return dic
    alex = Person('liuer',1,1,'Man')
    
    def Dog(name,hp,ad,sex):
        dic = {'name':name,'blood':hp,'attack':ad,'sex':sex}
        return dic
    ret = Dog('小黑',3000,10,'哈士奇')
    print(ret)

      对象之间发生关系

    人打狗   狗咬人 
    #互相打
    def fight(dog,person):
        #狗掉血,就是人的攻击力
        dog['blood']-= person['attack']
        print('%s打了%s,%s掉了%s'%(person['name'],dog['name'],dog['name'],person['attack']))
    def bite(dog,person):
        person['blood'] -= dog['attack']
        print('%s咬了%s,%s掉了%s'%(person['name'],dog['name'],dog['name'],person['attack']))
    hei = Dog('小黑',3000,10,'哈士奇')
    # fight(hei['blood'],person_ad=alex['attack'])
    fight(hei,alex)
    print(hei)
    bite(hei,alex)
    print(alex)

      不好的是,bite(a,b) ab两个元素,关系不明确 是 a bite b  还是 b bite a 

    改进 对象

      程序里dic['fight'] = fight    把函数 塞进了字典 可以通过  

      alex = Person('alex',20,1,'不详')   alex['fight'](hei) 调用  实现函数的嵌套

      但是为什么 return dic 返回 None 呢

    # 给两个特定的属于特定角色的方法 设置了他的使用范围
    # 让其他角色不能随意调用属于固定角色的方法
    def Person(name,hp,ad,sex):   # 模子
        dic = {'name':name,'blood':hp,'attack':ad,'sex':sex}
        def fight(dog):  # 攻击  属于人
            # 狗掉血,就是人的攻击力
            dog['blood'] -= dic['attack']
            print('%s打了%s,%s掉了%s血' % (dic['name'], dog['name'], dog['name'], dic['attack']))
        dic['fight'] = fight
        return dic
    def Dog(name,hp,ad,kind):
        dic = {'name': name, 'blood': hp, 'attack': ad, 'kind': kind}
        def bite(person):  # 咬 属于狗
            person['blood'] -= dic['attack']
            print('%s咬了%s,%s掉了%s血' % (dic['name'], person['name'], person['name'], dic['attack']))
        dic['bite'] = bite
        return dic
    # 互相打
    alex = Person('alex',20,1,'不详')
    hei = Dog('小黑',3000,10,'哈士奇')
    alex['fight'](hei)
    hei['bite'](alex)

    总结:

    # 先思考这个程序中有几个角色
    # 然后描述这个角色 属性和动作
    # 把这个属性和动作都装到一个角色中
    # 面向对象编程

    面向对象语法:

    # 对象 : 具有具体的属性值的 实际存在的例子
            #实例
    # 类:具有相同方法和属性的一类事物

      类总是大写字母开头

        两种方法调用类的元素

    class 类名:
        pass
    #空类
    class Dog: # 总是大写开头的
        变量1 = 100
        变量2 = 'abc'
        变量3 = [(1,2),(3,4)]
    print(Dog.__dict__)     #{'__module__': '__main__', '变量1': 100, '变量2': 'abc', '变量3': [(1, 2), (3, 4)], '__dict__': <attribute '__dict__' of 'Dog' objects>, '__weakref__': <attribute '__weakref__' of 'Dog' objects>, '__doc__': None}
    print(Dog.__dict__['变量1'])  #100
    # 第二种方法常用
    print(Dog.变量1)  #100
    print(Dog)  #<class '__main__.Dog'>
    # 每一只狗 都需要自己的属性

      新建一个完整的类

    class Dog:  # 狗模子  --类
        def __init__(self,name,hp,ad,sex):  #固定的  函数有默认参数
            print('执行了')        #self就可以当字典使用
            print(name,hp,ad,sex)
            self.name = name
            self.blood = hp
            self.ad = ad
            self.sex = ad
            # self.__dict__['name']  = name
            # self.__dict__['blood']  = hp
            # self.__dict__['ad']  =ad
            # self.__dict__['sex']  = sex
            print(self.__dict__)#{'name': 'alex', 'blood': 20, 'ad': 10, 'sex': '不祥'}
            #  不用 return self 自己就传出来
    # 具体的狗 对象  #自动的调用了Dog(对象) init
    alex = Dog('alex',20,10,'不祥')#  默认有一个参数  传了了五个
    #_init__() takes 1 positional argument but 5 were given
    print(alex.__dict__)#{'name': 'alex', 'blood': 20, 'ad': 10, 'sex': '不祥'}
    print(alex.name)
    print(alex.blood)

      实例化

    # 狗模子 狗对象 都是一个内存空间 字典
    # self 实际上 就是由 python 语法 开辟了 一个属于具体的对象的空间
    # 执行 init  想self  自动添加 key等属性
    #返回self
    # 对象 也是实例
    #创建了一个对象 也是创建实例
    # 实例化的过程:
        #1,开辟了一块块空间,创造了一个self变量来指向这块空间
        #2,调用init ,自动传self 参数,其他的参数都是按照顺序传进来的
        #3,执行init
        #4, 将self 自动返回调用者

      用的方法 而不是用函数的方法写 面向对象

    class Dog:  # 狗模子  --类
        a = 1000        #静态变量 这个类中的变量 是所有
        def __init__(self,name,hp,ad,sex):  #固定的  函数有默认参数
                        #self就可以当字典使用
            print(name,hp,ad,sex)       #实例变量 对象属性
            self.name = name
            self.blood = hp
            self.ad = ad
            self.type = sex
        def bite(self,person): #定义在类的内部的 动态变量 方法
            person.blood -= self.ad
            # print(self)
            # print(dog)
            print('%s 咬了 %s,%s 掉了 %s血'%(self.name,person.name,person.name,self.ad))
    dog1 = Dog('tai',200,20,'贵妇')   # 对象 实例
    # print(do.name)
    # print(do.type)          #引用实例变量 tai 引用对象的属性
    # print(Dog.a)        # 所有的静态变量的值都尽量用类名去操作
    # print(alex.a)
    class Person:  # 人模子  --类
        a = 1000        #静态变量 这个类中的变量 是所有
        def __init__(self,name,hp,ad,sex):  #固定的  函数有默认参数
            print('执行了')        #self就可以当字典使用
            print(name,hp,ad,sex)       #实例变量 对象属性
            self.name = name
            self.blood = hp
            self.ad = ad
            self.type = sex     # 对象的资源
        def fight(self,dog): #定义在类的内部的 动态变量 方法
            dog.blood -= self.ad
            print('%s 打了 %s , %s 掉了 %s血'%(self.name,dog.name,dog.name,self.ad))
    
    # print('do 是',do)    #do 是 <__main__.Dog object at 0x000000000289DDD8>
    taibai = Person('taibai',20,20,'male')
    print(taibai.fight(dog1))
    taibai.fight(dog1)
    dog1.bite(taibai)

     两种调用方法 :

        函数:ren['fight'](dog)       用fight 引用函数 ()  调用  dog是参数

        类:ren.fight(dog)   fight 是类的方法   dog 是另一个类的对象

  • 相关阅读:
    20181205关于android动态权限管理的总结与思考。
    pixel2坑
    Picasso遇到的坑
    集成主流框架搭建项目
    outdoor-youwin
    利用scatter()绘制颜色映射的二次方曲线
    一个有意义的Day类
    [Hadoop] Yarn & k8s
    hadoop 操作
    yarn 图形化监控
  • 原文地址:https://www.cnblogs.com/Doner/p/10593051.html
Copyright © 2020-2023  润新知