首页 > 其他分享 >11月6总结

11月6总结

时间:2022-11-06 19:56:40浏览次数:40  
标签:11 总结 .__ obj name dict __ print

11月6总结

一、面向对象之人狗大战

'''
推导思路:
1.代码定义出人和狗
2.将产生人和狗的字典封装成函数
3.定义人打狗的动作,和狗咬人的动作(生命值 = 攻击力-生命值)
4.解决人只能调用人的功能,狗只能调用狗的功能----->数据与功能的绑定
'''
代码实现:
def get_person(name,gender,age,p_type,attack_val,life_val):
    def person_attack(person_obj,dog_obj):
        print(f'人:{person_obj.get("name")}准备揍狗:{dog_obj.get("name")}')
        dog_obj['life_val'] -= person_obj['attack_val']
        print(f'狗挨了打,掉血:{person_obj.get("attack_val")}狗剩余血量:{dog_obj.get("life_val")}')
    person_obj = {
        'name': name,
        'gender': gender,
        'age': age,
        'p_type': p_type,
        'life_val': life_val,
        'attack_val': attack_val,
        'person_attack': person_attack
    }
    return person_obj


def get_dog(name,p_type,attack_val,life_val):
    def dog_attack(dog_obj,person_obj):
        print(f'狗:{dog_obj.get("name")}准备咬人:{person_obj.get("name")}')
        person_obj['life_val'] -= dog_obj['attack_val']
        print(f'狗咬了一口人:{dog_obj.get("attack_val")}狗剩余血量:{person_obj.get("life_val")}')

    dog_obj = {
        'name': name,
        'p_type': p_type,
        'life_val': life_val,
        'attack_val': attack_val,
        'dog_attack': dog_attack
    }
    return dog_obj

p1 = get_person('jj',19,'male','帅男',9999,888888)
d1 = get_dog('xiao hai','恶犬',4444,77777)
p1.get('person_attack')(p1,d1)

面向对象核心思想:数据与功能的绑定

image

二、面向对象编程思想

1.面向过程编程
  完成某一程序的所有步骤
  过程即流程,面向过程就是按照固定的流程解决问题
   eg:截止ATM之前学过的几乎都是面向过程编程
       注册功能,登录功能,购物车
   提出问题,然后制定出该问题的解决方案
2.面向对象编程
   对象即容器,数据与功能的结合体(Python中一切皆对象)
   只负责创造人物,功能后续具体怎么实现什么结果就不需要负责
ps:上述两种报错思想没有优劣之分,需要结合据图实际需求来定
    注册登录人脸识别----->>>面向过程
    游戏人物       ------>>>面向对象
实际编程两种思想彼此混合使用的

三、面向对象重要理论

对和类的定义
    对象:数据与功能的结合体
    类:多个对象相同数据和功能的结合体
程序中如果想要产生对象,必须要先定义出来
在python中,先有类再有对象的,一定要有类,才能借助于类产生对象

四、面向对象代码实操

1.类的语法结构

面向对象不是一门新的技术,为了更好的区分开来,针对面向对象设计了新的语法格式

  class 类名
     对象公共数据
     对象公共功能
    ps: 1.class是定义类的关键字
        2.类名的命名规范要注意首字母大写
        3.数据--->变量名与数据值的绑定
          功能(方法)---->函数
 

2.类的定义与调用

 类在定义阶段就会执行类体代码,属于类的局部名称空间,外界是无法调用的
# 定义类
class Student:
    # 对象公共的数据
    school_name = '芜湖大学'
    # 对象公共的功能
    def choice_course(self):
        print('学生选课功能')
# 查看名称空间
print(Student.__dict__)
print(Student.__dict__.get('school_name'))
print(Student.__dict__.get('choice_course'))
# {'__module__': '__main__', 'school_name': '芜湖大学', 'choice_course': <function Student.choice_course at 0x000001C50C2A7160>, '__dict__': <attribute '__dict__' of 'Student' objects>, '__weakref__': <attribute '__weakref__' of 'Student' objects>, '__doc__': None}
'''在面向对象中 类和对象访问数据或者功能 可以统一采用句点符'''
print(Student.school_name)
print(Student.choice_course)  
# 类的调用>>>:产生对象
#类名加括号就会产生对象 并且每执行一次都会产生一个全新的对象
obj1 = Student()  # 变量名obj1接收类名加括号之后的返回值(结果)
obj2 = Student()
obj3 = Student()
print(obj1, obj2, obj3)
print(obj1.__dict__)  # 对象自己目前什么都没有
print(obj2.__dict__)
print(obj3.__dict__)

print(obj1.school_name)
print(obj2.school_name)
print(obj3.school_name)

Student.school_name = '长安大学'

print(obj1.school_name)
print(obj2.school_name)
print(obj3.school_name)   # 长安大学
# 数据和功能 也可以统称为属性    数据>>>属性名       功能>>>:方法

五、对象独有的数据

#推导流程1:每个对象手动添加独有的数据
class Student:
    # 对象公共的数据
    school_name = '芜湖大学'
    # 对象公共的功能
    def choice_course(self):
        print('学生选课功能')
obj1 = Student()
obj2 = Student()

 print(obj1.__dict__)
 obj1.__dict__['name'] = 'jason'  
 obj1.__dict__['age'] = 18
obj1.__dict__['hobby'] = 'study'  # 当存在的情况下 则修改对应的值 当不存在的情况下 则新增

 print(obj1.__dict__)
 print(obj1.name)
 print(obj1.age)
 print(obj1.hobby)

 print(obj2.__dict__)
 obj2.__dict__['name'] = 'kevin'
 obj2.__dict__['age'] = 28
 obj2.__dict__['hobby'] = 'music'
 print(obj2.__dict__)
 print(obj2.name)
 print(obj2.age)
# 推导流程2:将添加对象独有数据的代码封装成函数
class Student:
    # 对象公共的数据
    school_name = '芜湖大学'
    # 对象公共的功能
    def choice_course(self):
        print('学生选课功能')
obj1 = Student()
obj2 = Student()
 def init(obj, name, age, hobby):
     obj.__dict__['name'] = name
     obj.__dict__['age'] = age
     obj.__dict__['hobby'] = hobby
 stu1 = Student()
 stu2 = Student()
 init(stu1, 'jason', 18, 'music')
 init(stu2, 'kevin', 29, 'read')
 print(stu1.__dict__)
 print(stu2.__dict__)
# 推导流程3:给学生对象添加独有数据的函数只有学生对象有资格调用
 class Student:
     # 对象公共的数据
     school_name = '芜湖大学'
     # 专门给学生添加独有数据的功能
    def init(obj, name, age, hobby):
         obj.__dict__['name'] = name
         obj.__dict__['age'] = age
         obj.__dict__['hobby'] = hobby
     # 对象公共的功能
     def choice_course(self):
         print('学生选课功能')
 stu1 = Student()
 Student.init(stu1, 'jason', 18, 'music')
 stu2 = Student()
 Student.init(stu2, 'kevin', 29, 'read')
 print(stu1.__dict__, stu2.__dict__)
# 推导步骤4:init方法变形
 class Student:
     # 对象公共的数据
     school_name = '芜湖大学'

    # 专门给学生添加独有数据的功能  类产生对象的过程中自动触发
     def __init__(obj, name, age, hobby):
        obj.__dict__['name'] = name
         obj.__dict__['age'] = age
         obj.__dict__['hobby'] = hobby

     # 对象公共的功能
     def choice_course(self):
         print('学生选课功能')

 stu1 = Student('jason', 18, 'read')
 print(stu1.__dict__)
 print(stu1.name)
 print(stu1.school_name)
# 推导步骤5:变量名修改  最标准的写法
class Student:
    # 对象公共的数据
    school_name = '芜湖大学
    # 专门给学生添加独有数据的功能  类产生对象的过程中自动触发
    def __init__(self, name, age, hobby):
        self.name = name  # self.__dict__['name'] = name
        self.age = age
        self.hobby = hobby
    # 对象公共的功能
    def choice_course(self):
        print('学生选课功能')

stu1 = Student('jason', 18, 'read')
print(stu1.name)
print(stu1.school_name)

六、对象独有的功能

class Student:
    # 对象公共的数据
    school_name = '芜湖大学'
    # 专门给学生添加独有数据的功能  类产生对象的过程中自动触发
    def __init__(self, name, age, hobby):
        self.name = name  # self.__dict__['name'] = name
        self.age = age
        self.hobby = hobby
    # 对象公共的功能
    def choice_course(self):
        print(f'学生{self.name}正在选课')

stu1 = Student('jason', 18, 'music')
stu2 = Student('kevin', 28, 'read')
# 将函数放在类中 但是类中的函数又是对象公共的
# 定义在类中的功能 默认就是绑定给对象使用的 
 Student.choice_course(123)  # 类调用需要自己传参数
 stu1.choice_course()    
 # 对象调用会自动将对象当做第一个参数传入
 stu1.choice_course()
 stu2.choice_course()
# 对象修改数据值
stu1.name = 'tony'  # 当点的名字已经存在的情况下 则修改对应的值
# 对象新增数据值
stu1.pwd = 123  # 当点的名字不存在的情况下 则新增数据
print(stu1.__dict__)

七、动静态方法

什么是动静态?
 动态就是绑定给对象的方法直接在类体代码中编写即可,对象调用会自动将对象当做第一个参数传入,类调用有几个形参就传几个实参;静态方法就是普通的函数
代码实现:
class Person:
    type = '动物'

    def Monkey(self):  # 给对象绑定数据,self用于接收对象
        print('一只猴子', self)

    @classmethod  # 给类绑定方法,cls用于接收类
    def duck(cls):
        print('一只小黄鸭', cls)

    @staticmethod  # 被@staticmethod修饰的方法,就是静态方法
    def chicken(a, b):  # 按照普通函数传参方式
        print('一只火鸡')


stu1 = Person()
Person.duck()  # 类调用会自动将类当做第一个参数传入
stu1.duck()  # 对象调用会自动将产生该对象的类当做第一个参数传入

Person.chicken(1, 2)

image

八、面向对象三大特征之继承

1.面向对象三大特征
  继承   封装   多态
2.继承的含义
  继承就是让类继承了另外一个类转变为父子关系,子类可以直接访问父类的静态方法和属性,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类。
3.继承的目的
   可以减少代码编写
    减少代码的冗余
    提高重复使用率
4.继承的操作
   定义:
      class 类名(父类名):
            pass
    定义类的时候类名后面加客户
    括号内填写你需要继承的类名
    括号内可以填写多个父类,用逗号隔开
# 定义父类
class Father():
    name = 'daddy'
# 定义子类,继承父类
class Son(Father):
    pass

# 3. 创建子类对象,并调用其继承到的属性和方法
obj = Son()
print(obj.name)

九、继承的本质

1.对象:数据和功能的结合体
2.类:多个对象相同的数据和功能的结合体
3.父类:多个类相同数据和功能的结合体
4.抽象:把多个类公共的数据或功能那出来形成一个基类
5.继承:从上往下获取每个基类中的资源
类与父类的本质都是为了节省代码

十、数据和方法的查找顺序

1.不继承父类的情况下名字的查找顺序

class Son():
    name = 'one'
obj = Son()
print(obj.name)   # one
对象自身  ---->>类

2.单继承情况下的名字查找顺序

class Father():
    name = 'father'
class Son():
    # name = 'one'
obj = Son()
print(obj.name)   # father
对象自身 ----> 类 ---->继承的父类

3.多继承的情况下名字查找顺序

class D():
    name = 'D'
class C():
    name = 'C'
class B():
    name = 'B'

class A(C):
    # name = 'A'
    pass
obj = A()
print(obj.name)

顺序:A->B  C->D
非菱形继承深度优先 每个分支走到底,再切换
图片名称
class E():
    name = 'E'
class D(E):
    name = 'D'
class C(D):
    name = 'C'
class B(E):
    name = 'B'

class A(B):
    # name = 'A'
    pass
obj = A()
print(obj.name)

顺序:A->B  C->D->E
菱形继承深度优先 (前面几个分支都不会走最后一个类 最后一个分支才会走)
当实在搞不清的时候可以用类点mro()方法查看该类产生的对象名字的查找顺序
图片名称
总结:
   菱形继承
    	广度优先(最后才会找闭环的定点)
  	非菱形继承
    	深度优先(从左往右每条道走完为止)
 	ps:mro()方法可以直接获取名字的查找顺序

十一、经典类与新式类

经典类:不继承object或者其子类的类
新式类:继承object或者其子类的类
1.Python2解释器中有经典和新式类
2.Python3解释器中只有新式类,所有的类默认都会继承object

十二、派生方法

子类基于父类某个方法做了扩展

class Person:
    def __init__(self, name, age, gender):
        self.name = name
        self.age = age
        self.gender = gender


class Student(Person):
    def __init__(self, name, age, gender, sid):
        super().__init__(name, age, gender)  # 子类调用父类的方法
        self.sid = sid


class Teacher(Person):
    def __init__(self, name, age, gender, level):
        super().__init__(name, age, gender)
        self.level = level


stu1 = Student('jason', 18, 'male', 666)
print(stu1.__dict__)
tea1 = Teacher('tony', 28, 'female', 99)
print(tea1.__dict__)



class MyList(list):
    def append(self, values):
        if values == 'jason':
            print('jason不能尾部追加')
            return
        super().append(values)

obj = MyList()
print(obj, type(obj))
obj.append(111)
obj.append(222)
obj.append(333)
obj.append('jason')
print(obj)

标签:11,总结,.__,obj,name,dict,__,print
From: https://www.cnblogs.com/zx0524/p/16863585.html

相关文章

  • 2022-2023-1 20221414《计算机基础和程序设计》第10周学习总结
    基本信息这个作业属于哪个课程2022-2023-1-计算机基础与程序设计这个作业要求在哪里2022-2023-1计算机基础与程序设计第一周作业这个作业的目标信息系统,数......
  • 11.6.1
    #include<stdio.h>intzd(intarr[],intx);intmain(){inti,n;scanf("%d\n",&n);intarr[100];for(i=0;i<n;i++){scanf("%d",&arr[i]);} zd(arr,n);return0;......
  • 11.6.2
    #include<stdio.h>intmain(){ intarr[10];inti,n; for(i=0;i<=9;i++) {scanf("%d",&arr[i]); } scanf("%d",&n); intj,count=0; for(j=0;j<=9;j++) {if(arr[......
  • 学习框架总结
    我们小组即将进入代码编写阶段,以下内容是小组成员对系统实现所涉及的架构进行学习后的内容总结。********************************************************************......
  • 2022-2023-1 20221423 《计算机基础与程序设计》第十周学习总结
    学年2022-2023-1学号20221423《计算机基础与程序设计》第十周学习总结作业信息这个作业属于哪个课程<班级的链接>2022-2023-1-计算机基础与程序设计这个作......
  • 2022-2023-1 20221415 《计算机基础与程序设计》第十周学习总结
    2022-2023-120221415《计算机基础与程序设计》第十周学习总结作业信息这个作业属于哪个课程<班级的链接>(2022-2023-1-计算机基础与程序设计)这个作业要求在哪......
  • 06周总结
    项目开发流程项目需求分析产品经理(甲方需求)--架构师--开发经理1.架构师负责提前构思需求大概需要用的技术方案,引导客户提出合理的要求项目架构的设计2.决......
  • 本周总结11.6
    本周总结1.面向对象前戏2.编程思想3.类与对象4.对象独有的数据5.对象独有的功能6.动静态方法7.继承8.名字的查找顺序9.经典类与新式类10.派生方法1.面向对象前......
  • 第六周总结
    面向对象目录面向对象核心思路前戏之人狗大战编程思想类与对象类与对象的创建清华大学学生选课系统对象的独有数据对象的独有方法动静态方法继承的概念继承的本质名字的查......
  • 服务框架基础知识总结
    转载:https://www.cnblogs.com/imyalost/p/10274797.html参考:《京东基础架构建设之路》 要组成一个基本的通信服务框架,最起码需要这三部分:统一的RPC框架、服务注册中心......