• python学习之老男孩python全栈第九期_day022知识点总结——初识面向对象


    一. 面向对象的引入
    # 人狗大战
    def person(name,HP,aggr,sex):
        person = {
            'name':name,   # 昵称
            'HP':HP,           # 生命值
            'aggr':aggr,           # 攻击力
            'sex':sex
        }
        return person
    alex = person('狗剩儿',100,2,'不详')
    nezha = person('哪吒',200,1,'不详')

    # 代码精简了,方便增加人物,方便修改,人物更加规范 ------ 人的模板

    print(alex)
    def dogs(name,HP,aggr,kind):
        dog = {
            'name':name,
            'HP':HP,
            'aggr':aggr,
            'kind':kind
        }
        return dog
    jin = dogs('金老板',1000,1,'泰迪')
    
    # 人:攻击技能(打)
    def attack(person,dog):
        dog['HP'] -= person['aggr']
        print('%s被打了,掉了%s滴血'%(dog['name'],person['aggr']))
    # 狗:攻击技能(咬人)
    def bite(dog,person):
        person['HP'] -= dog['aggr']
        print('%s被咬了,掉了%s滴血'%(person['name'],dog['aggr']))

    # dogs函数、person函数都是定义了一类事物
    # 直到调用了函数,赋了值之后才真的有了实实在在的人或狗

    bite(jin,alex)
    print(alex)
    bite(nezha,jin)             # 变成了人咬狗了,乱了乱了,怎么办?

    于是:

    def person(name,HP,aggr,sex):
        person = {
            'name':name,   # 昵称
            'HP':HP,           # 生命值
            'aggr':aggr,           # 攻击力
            'sex':sex,
        }
    
        # 人:攻击技能(打)
        def attack(dog):
            dog['HP'] -= person['aggr']
            print('%s被打了,掉了%s滴血' % (dog['name'], person['aggr']))
    
        person['attack'] = attack  # 函数名  攻击技能
    
        return person
    
    def dogs(name,HP,aggr,kind):
        dog = {
            'name':name,
            'HP':HP,
            'aggr':aggr,
            'kind':kind
        }
    
        # 狗:攻击技能(咬人)
        def bite(person):
            person['HP'] -= dog['aggr']
            print('%s被咬了,掉了%s滴血' % (person['name'], dog['aggr']))
    
        dog['bite'] = bite
        return dog
    
    
    alex = person('狗剩儿',100,2,'不详')
    nezha = person('哪吒',200,1,'不详')
    jin = dogs('金老板',1000,1,'泰迪')
    
    jin['bite'](alex)
    alex['attack'](jin)

    # 面向对象编程
    # 所谓模板,就是 类 --- 抽象的,我能知道有什么属性,但不能知道属性具体的值
    # jin alex nezha 就是对象 --- 有具体的值,属性都是根据 类 规范的

    二. 初识面向对象
    字典就是一类数据结构,我一说字典你就知道是那个用{}表示,里面由k-v键值对的东西,它还具有一些增删改查的方法。
    但是我一说字典你能知道字典里具体存了哪些内容么?不能,所以我们说对于一个类来说,它具有相同的特征属性和方法。

    print(list) # 类
    [1,2] # 对象

    自定义一个类 # 类名开头一般大写
    定义函数时:
    def 函数名():
        pass
    
    
    定义类
    class 类名:       # 可以加括号,可以不加
        属性 = 'a'
    print(类名.属性)            # a
    类名的作用,就是操作属性,查看属性
    # 人狗大战
    class Person:                     # 类名
        country = 'China'                  # 创造了一个只要是这个类就一定有的属性,这个属性叫做 类属性 ,也叫 静态属性
        def __init__(self,*args):     # 初始化方法,self是对象,必须有
            print(self.__dict__)            # {} , self就是一个可以存储很多属性的大字典
            self.name = args[0]             # name 为属性  ,往字典里添加属性的方式发生了一些变化
            self.HP = args[1]               # HP 为属性
            self.aggr = args[2]             # aggr 为属性
            self.sex = args[3]              # sex 为属性
            print(self.__dict__)            # {'name': '狗剩儿', 'HP': 100, 'aggr': 2, 'sex': '不详'}
            print(id(self))                 # 2085337454856
    
        def walk(self,n):             # 方法,一般情况下,必须传self参数,且必须写在第一个,后面还可以传其他参数
            print('{} 走走走,走了{}步'.format(self.name,n))
    
    alex = Person('狗剩儿',100,2,'不详')     # 对象        # 实例化,,# 类名,可以实例化对象
    # print(alex.__dict__)       # {'name': '狗剩儿', 'HP': 100, 'aggr': 2, 'sex': '不详'},查看所有属性
    # print(alex)             # <__main__.Person object at 0x0000018EFBBD58D0>
    # print(alex.name)        # 狗剩儿
    # print(alex.HP)          # 100
    # print(id(alex))         # 2085337454856  内存地址一样
    print(Person.__dict__)    # Person里面有walk
    Person.walk(alex,5)           # 调用方法 :类名.方法名(对象名)
    # alex.walk()         # 相当于 Person.walk(alex)
    alex.walk(5)         # 相当于 Person.walk(alex,5)
    
    print(Person.country)       # 类名 ,可以查看类中的属性,不需要实例化就可以查看
    
    print(Person.__dict__['country'])           # China
    print(alex.__dict__['name'])                # 狗剩儿
    
    # Person.__dict__['country'] = '印度'           # 报错 对于类的字典,只能看,不能改

    对于对象,可不可以修改?,可不可以删除?
      可以的,可以的
    alex.__dict__['name'] = '二哥'
    print(alex.__dict__)                        # {'name': '二哥', 'HP': 100, 'aggr': 2, 'sex': '不详'}
    # 但一般不这么改。
    # 应该这样改:
    print(alex.name)                    # 二哥
    alex.name = '大哥'
    print(alex.name)                    # 大哥
    print(alex.__dict__)                # {'name': '大哥', 'HP': 100, 'aggr': 2, 'sex': '不详'}
    alex.age = 88                     # 增加一个属性
    print(alex.__dict__)                # {'name': '大哥', 'HP': 100, 'aggr': 2, 'sex': '不详', 'age': 88}

    总结:
    对象 = 类名()
    过程:
        类名() 首先会创造出一个对象,创建了一个self变量
        调用__init__方法,类名括号里的参数会被这里接收
        执行__init__方法
        返回self
    对象能做的事:
        查看属性:print(alex.name)、print(alex.HP)
        调用方法
        __dict__  对于对象的增删改查操作都可以通过字典的语法进行
    类名能做的事:
        实例化
        调用方法,只不过要自己传递self参数
        调用类中的属性,也就是调用静态属性
        __dict__,对于类中的名字只能看,不能操作
  • 相关阅读:
    2020.10.25【NOIP提高A组】模拟 总结
    6831. 2020.10.24【NOIP提高A组】T1.lover
    枚举一个数$n$的所有质因子
    gmoj 6832. 2020.10.24【NOIP提高A组】T2.world
    2020.10.24【NOIP提高A组】模拟 总结
    2020.10.17【NOIP提高A组】模拟 总结
    jQuery EasyUI Portal 保存拖动位置,仿谷歌DashBoard效果的
    SQLMAP注入教程-11种常见SQLMAP使用方法详解
    Windows下sqlmap的安装图解
    swap file "*.swp" already exists!的解决方法
  • 原文地址:https://www.cnblogs.com/lpgit/p/9385551.html
Copyright © 2020-2023  润新知