昨日内容回顾

  • 人狗大战

    1.直接使用字典表示人和狗
    p1 = {}
    p2 = {}
    p3 = {}
    p4 = {}
    2.封装产生人和狗的函数
    def crreate_person():pass
    def create_dog():pass
    3.封装人和狗的攻击动作
    def person_attack(person_dict,dog_dict):pass
    def dog_attack(dog_dict,person_dict):pass
    4.针对人和狗的攻击动作只能针对性调用
    人只能调用人的攻击动作 狗只能调用狗的攻击动作
    5.将数据与功能绑定到一起
    def get_person():
    def person_attack():pass
    return
    {'person_attack':person_attack}
    def get_dog():
    def dog_attack():pass
    return {'dog_attack':dog_attack}
    6.面向对象核心思想:数据与功能的绑定
  • 编程思想

    面向过程编程
    针对具体的问题给出具体的解决流程
    eg:注册功能 登录功能 转账功能
    面向对象编程
    没有具体的流程 我们只负责造物
    eg:游戏人物
    '''两种思想不是独立的 是相互融合的'''
  • 类与对象的概念

    类
    多个对象相同数据和功能的结合体
    对象
    数据与功能的结合体
  • 类与对象的代码实操

    class Student:
    pass
    obj = Student()
    1.如何查看类或者对象名称空间中可以使用的名字
    类/对象.__dict__
    2.面向对象访问名字统一采用句点符
    类/对象.名字
    3.类名加括号一定会产生一个新的对象
    obj1 = Student()
    obj2 = Student()
    obj3 = Student()
  • 对象的独有数据

    1.直接利用对象点名字的方式
    obj1 = Student()
    obj1.__dict__['name'] = 'jason'
    obj1.age = 18
    obj2 = Student()
    obj2.__dict__['name'] = 'kevin'
    obj2.age = 29
    2.将添加对象独有数据的代码封装成函数
    def init(obj,name,age):
    obj.name = name # obj.__dict__['name'] = name
    obj.age = age # obj.__dict__['age'] = age
    3.将上述方法绑定给特定类的对象
    class Student:
    def init(obj,name,age):
    obj.name = name # obj.__dict__['name'] = name
    obj.age = age # obj.__dict__['age'] = age
    4.自动触发的方法
    class Student:
    def __init__(self,name,age)
    self.name = name # obj.__dict__['name'] = name
    self.age = age # obj.__dict__['age'] = age
    5.类中如果有双下init方法 意味着类加括号需要传参数
    obj = Student('jason',18)
  • 对象的独有方法

    1.也是直接在全局定义函数 然后给对象
    def func():pass
    obj = Student()
    obj.func = func
    2.面向对象的思想 放到类中
    3.对象的绑定方法
    类中定义的方法可以说是对象公共的方法 也可以是对象独有的方法
    哪个对象来调用 谁就是主人公

动静态方法

在类中定义的函数有多种特性
class Student:
school_name = '摆烂大学' # 1.类中直接定义函数 默认绑定给对象 类调用有几个参数传几个 对象 调用第一个参数就是对象自身
def func1(self):
print('看谁最能摆烂 真的好棒棒!!!!') # 2.被@classmethod修饰的函数 默认绑定给类 类调用第一个参数就是类自身 对象也可以调用并且会自动将产生该对象的类当做第一个参数传入
@classmethod
def func2(cls):
print('嘿嘿嘿 猜猜我是干嘛滴', cls) # 3.普普通通的函数 无论是类还是对象调用 都必须自己手动传参
@staticmethod
def func3(a):
print('哈哈哈 猜猜我又是什么', a) obj = Student()
# 1.绑定给对象的方法
obj.func1()
Student.func1(123)
# 2.绑定给类的方法
Student.func2() # func2(Student)
obj.func2() # func2(Student)
# 3.静态方法
Student.func3(123)
obj.func3(321)

面向对象之继承的概念

"""
面向对象三大特性
封装 继承 多态
1.三者中继承最为核心(实操最多 体验最强)
2.封装和多态略微抽象
"""
1.继承的含义
在现实生活中继承表示人与人之间资源的从属关系
eg:儿子继承父亲 干女儿继承干爹
在编程世界中继承表示类与类之间资源的从属关系
eg: 类A继承类B
2.继承的目的
在现实生活中儿子继承父亲就拥有了父亲所有资源的支配权限
在编程世界中类A继承类B就拥有了类B中所有的数据和方法使用权限
3.继承的实操
class Son(Father):
pass
1.在定义类的时候类名后面可以加括号填写其他类名 意味着继承其他类
2.在python支持多继承 括号内填写多个类名彼此逗号 隔开即可
class Son(F1,F2,F3):
pass
"""
1.继承其他类的类 Son
我们称之为子类、派生类
2.被继承的类 Father F1 F2 F3
ps: 我们最常用 的就是子类和父类
"""

继承的本质

"""
对象:数据与功能的结合体
类(子类):多个对象相同数据和功能的结合体
父类: 多个类(子类) 相同数据和功能结合体
ps:类与父类本质都是为了节省代码
"""
继承本质应该分为两部分
抽象:将多个类相同的东西抽出去形成一个新的类
继承:将多个类继承刚刚抽取出来的新的类

名字的查找顺序

1.不继承情况下名字的查找顺序
class C1:
name = 'jason' def func(self):
print('from func')
obj = C1()
# print(C1.name) # 类肯定找的自己的
obj.name = '你迷了吗' # 由于对象原本没有name属性 该语法会在对象名称空间中创建一个新的"键值对"
print(obj.__dict__)
print(obj.name) # 你迷了吗
print(C1.name)
"""
对象查找名字的顺序
1.先从自己的名称空间中查找
2.自己没有再去产生该对象的类中查找
3.如果类中也没有 那么直接报错
对象自身 >>> 产生对象的类
"""
2.单继承情况下名字的查找顺序
# class F1:
# name = 'jason'
# class S1(F1):
# name = 'kevin'
# obj = S1()
# obj.name = 'oscar'
# print(obj.name)
''' 对象自身 >>> 产生对象的类 >>> 父类'''
class F3:
name = 'jerry'
pass class F2(F3):
name = 'tony' class F1(F2):
# name = 'jason'
pass class S1(F1):
# name = 'kevin'
pass obj1 = S1()
# obj1.name = '嘿嘿嘿'
print(obj1.name) class A1:
def func1(self):
print('from A1 func1') def func2(self):
print('from A1 func2')
self.func1() class B1(A1):
def func1(self):
print('from B1 func1') obj = B1()
obj.func2() """
强调: 对象点名字 永远从对象自身开始一步步查找
以后在看到self.名字的时候 一定要搞清楚self指代的是哪个对象
"""
3.多继承情况下名字的查找顺序
菱形继承
广度优先(最后才会找闭环的定点)
非菱形继承
深度优先(从左往右每条道走完为止)
ps:mro()方法可以直接获取名字的查找顺序
'''
对象自身 >>> 产生对象的类 >>>> 父类 (从左往右)
'''
# class F1:
# # name = 'jason'
# pass
#
#
# class F2:
# # name = 'oscar'
# pass
#
# class F3:
# # name = 'jerry'
# pass
#
# class S1(F1, F2, F3):
# # name = '嘿嘿嘿'
# pass
# obj = S1()
# # obj.name = '想干饭'
# print(obj.name)
'''
对象自身 >>> 产生对象的类 >>> 父类(从左往右)
'''
class G:
name = 'from G'
pass
class A:
# name = 'from A'
pass
class B:
# name = 'from B'
pass
class C:
# name = 'from C'
pass
class D(A):
# name = 'from D'
pass
class E(B):
# name = 'from E'
pass
class F(C):
# name = 'from F'
pass class S1(D,E,F):
pass
obj = S1()
# print(obj.name) print(S1.mro())

经典类与新式类

"""
经典类:不继承cbject或者其子类的类
新式类:继承object或者其子类的类
在python2中有经典类和新式类
在python3中只有新式类(所有类默认都继承object)
"""
class Student(object):pass
ps:以后我们在定义类的时候 如果没有其他明确的父类 也可能习惯写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) # 子类调用父类的方法(可以考虑用super()方法限制特殊功能)
self.sid = sid class Teacher(Person):
def __init__(self,name,age,gendermlevel):
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)

派生方法扩展

派生方法:子类中编写了与父类中相同的方法、并在该方法调用了父类的方法
super():子类调用父类的方法
先找到self自身位置 """
class C:
def func1(self):
print('from C func1') class A(C):
def func1(self):
print('from A func1') def func2(self):
print('from A func2')
super().func1() # 调用的C里面的func1
self.func1() # 调用的B里面的func1 class B(A):
def func1(self):
print('from B func1') obj = B()
obj.func2()
print(B.mro())
"""

python之路24之 面向对象动静态方法、继承、派生的更多相关文章

  1. Python之路,Day7 - 面向对象编程进阶

    本节内容: 面向对象高级语法部分 经典类vs新式类 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 作业:开发一个支持多用户在线的FTP程序 经典类vs新式类 把下面代 ...

  2. Python之路,Day8 - 面向对象编程进阶

    本节内容: 面向对象高级语法部分 经典类vs新式类 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 作业:开发一个支持多用户在线的FTP程序 面向对象高级语法部分 经典 ...

  3. Python之路系列:面向对象初级:静态属性、静态方法、类方法

    一.静态属性 静态属性相当于数据属性. 用@property语法糖装饰器将类的函数属性变成可以不用加括号直接的类似数据属性. 可以封装逻辑,让用户感觉是在调用一个普通的数据属性. 例子: class ...

  4. python之路——24

    复习 1.面向对象编程 思想:角色的抽象,创建类,实例化,操作实例2.面向对象的关键字 1.类的静态属性,存储在类的命名空间 2.类名.方法(对象),对象.方法 3.对象可以使用静态变量:类不可以使用 ...

  5. 【python之路34】面向对象作业之学生选课系统

    一.需求: 1.可以注册管理员账号,管理员账号可以创建老师和课程 2.学生可以注册和登陆,学生可以从课程列表选课,可以进行上课登记查看 二.代码 1.文件目录 bin 存放可执行文件 config 存 ...

  6. 【python之路24】装饰器

    1.装饰器的应用场景 通常IT公司的程序开发是分工的,例如某公司某个部门负责底层函数的开发,另一个部门利用其函数实现高级功能,那么如果负责底层开发的函数需要改动,一般来说不会直接在函数上进行修改,通常 ...

  7. Python基础指面向对象:2、动静态方法

    面向对象 一.动静态方法 在类中定义的函数有多种特性 1.直接在类中定义函数 ​ 再类中直接定义函数,默认绑定给对象,类调用时有几个参数就要传几个参数,对象调用时该函数的第一个参数默认为对象 # 定义 ...

  8. Python之路【第五篇】:面向对象及相关

    Python之路[第五篇]:面向对象及相关   面向对象基础 基础内容介绍详见一下两篇博文: 面向对象初级篇 面向对象进阶篇 其他相关 一.isinstance(obj, cls) 检查是否obj是否 ...

  9. python 自动化之路 day 08 面向对象进阶

    面向对象高级语法部分 经典类vs新式类 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 面向对象高级语法部分 经典类vs新式类 把下面代码用python2 和python3都执行一下 1 2 ...

  10. Python之路【第五篇】:面向对象和相关

    Python之路[第五篇]:面向对象及相关   面向对象基础 基础内容介绍详见一下两篇博文: 面向对象初级篇 面向对象进阶篇 其他相关 一.isinstance(obj, cls) 检查是否obj是否 ...

随机推荐

  1. ASCII(American Standard Code for Information Interchange,美国标准信息交换代码)

    ASCII(American Standard Code for Information Interchange,美国标准信息交换代码) ASCII简介 ASCII(American Standard ...

  2. Linux 下搭建 HBase 环境

    Linux 下搭建 HBase 环境 作者:Grey 原文地址: 博客园:Linux 下搭建 HBase 环境 CSDN:Linux 下搭建 HBase 环境 前置工作 首先,需要先完成 Linux ...

  3. 常用RE对照表——敬请期待!!!

    .* #任意长度任意字符

  4. JSON parse error: Cannot deserialize value of type `java.lang.Integer` from Boolean value

    问题原因所在:前端Vue传输的数据字段类型和后端实体类字段不一致. 我的实体类字段是int类型.前端传输的数据是布尔类型. 文章目录 1.后端方法 2.实体类字段 2.前端传输的数据 1.后端方法 @ ...

  5. Spring 深入——IoC 容器 02

    IoC容器的实现学习--02 目录 IoC容器的实现学习--02 回顾 IoC 容器的初始化过程: BeanDefinition 的 Resource 定位 小结: 回顾 前面学习了 IoC 模式的核 ...

  6. 2.Python封装练习及私有属性

    面向对象三大特性 封装:根据职责将属性和方法封装到一个抽象的类中 继承:实现代码的重用,相同代码不需要重复的编写 1.单继承 2.多继承 多态:不同的对象调用相同的方法,产生不同的执行结果,增加代码的 ...

  7. 浅谈ORM-对象关系映射

    目前.NET(C#)中比较流行的ORM框架: SqlSugar (国内) Dos.ORM (国内) Chloe (国内) StackExchange/Dapper (国外) Entity Framew ...

  8. Codeforces Global Round 23 A-D

    比赛链接 A 题解 知识点:贪心,构造. 注意到有 \(1\) 就一定能构造. 时间复杂度 \(O(n)\) 空间复杂度 \(O(1)\) 代码 #include <bits/stdc++.h& ...

  9. SystemParametersInfo函数说明

    SystemParametersinfo 返回值:如果函数调用成功,返回值非零:如果函数调用失败,那么返回值为零.若想获取更多错误信息,请调用GetLastError函数. SystemParamet ...

  10. 【题解】CF1714F Build a Tree and That Is It

    题面传送门 解决思路 题目中虽然说是无根树,但我们可以钦定这棵树的根为节点 \(1\),方便构造,这是不 影响结果的. 以下记给定的三段长度为 \(a,b,c\). 先考虑无解的情况. 首先,给出的三 ...