python32-继承-名字查找顺序-经典类与新式类

今日学习

对象独有的功能

面向对象三大特性之继承

继承的本质

名字查找顺序

经典类与新式类

派生方法

对象独有的功能

class Persion:
	h_type = '人类'
	def __init__(self,name): 	#让对象拥有独有的数据
		self.name = name    
	#定义类中的函数,我们称之为方法
	def eat(self): #是多个对象公共的方法,也算多个对象独有的方法,对象来调用就会将数据传入
		print('%s正在干饭'%%self.name)
	def other(self,a,b):
		print('others 哈哈哈')
-------------------------------------------------------
特点
针对对象独有的方法,我们无法真正实现

1.如果在全剧则不是独有的

2.如果在类中则是公共的

python 解释器针对上述问题添加一个非常牛的特性

定义在类中的函数默认是绑定给对象的(相当于对象独有的方法)

动静态方法

  • 第一种 : 绑定【对象】的方法调用

对象调用:self

1.1.类里面定义的函数。默认获取绑定对象本身

1.2对象调用时候,默认将对象作为第一个实参传入

1.3类调用的时候需要根据函数形参数个数传参

-----------------------------第一种例子例子------------------------------------

class Student:
    school = '清华大学'

# 绑定给对象的方法
    def run(self):  # self用于接收对象
        print('老六赶紧跑!!!', self)

stu1 = Student()
stu1.run()
--------执行结果---------
老六赶紧跑!!! <__main__.Student object at 0x0000027B3C8346A0>
  • 第二种 : 绑定类的调用


2.1 跟上内置语法糖@classmethod
​ 类调用:cls

2.2 类调用的时候,默认将类当作第一个参数传入

2.3 就算是对象调用类的方法,也不会出现报错,默认将对象的类当做第一个参数传参。

class Student:
    school = '清华大学'

    @classmethod  # 绑定给类的方法
    def eat(cls):  # cls用于接收类
        print('老六你可真有才', cls)
Student.eat()
-----执行结果--------------
老六你可真有才 <class '__main__.Student'>
  • 第三种 : 静态方法 【普普通通的函数】


@staticmethod定义修饰的函数;

有多个形参,就需要传多个实参;

类 和 对象都必须根据形参数进行传参。

class Student:
    school = '清华大学'

    @staticmethod  # 静态方法
    def sleep(a, b):  # 无论谁来调用都必须按照普普通通的函数传参方式
        print('老六快去睡觉吧')
stu1 = Student()
Student.sleep(1, 2)
stu1.sleep(1, 2)
------------执行结果-------------
老六快去睡觉吧
老六快去睡觉吧

面向对象三大特性之继承 (非常重要)

  • 三大特性:

1.继承

2.封装

3.多态

----------------

  • 1.继承的含义?

1.现实生活角度:人与人直接的资源关系传递

​ eg:父与子的关系

2.编程的角度:描述类与类直接的数据关系

​ eg: 类A继承类B(拥有了类B所有的数据和功能)

  • 1.2.继承目的?

继承为了节省代码的编写,可以继承一个,也可以继承多个类
  • 1.3 如何继承,继承操作?

1.定义类的时候在类名加括号

2.括号里填写哪个类名,就是继承哪个类

3.如果继承多个类,用逗号隔开,从左往右

  • 继承的方式

    单继承

    多继承


  • 单继承

----------------------------------例子:-----------------------------------

class Father:				#父类

money = 100

def run(self):

print(几百万量车')


class Son(Father):     	 	#子类 

pass

print(Son.money)

-------执行结果------
100                         # 此时Son 继承了Father 
  • 多继承

------------------------多继承例子---------------------------------------------
class  F1:
name = 'from f1'

class F2:
name = 'from  f2'

class F3:
name = 'from f3'


class MyClass(F1,F2,F3):

pass

print(MyClass.name)    #从左到右掌握父类属性
  • 结论:

我们将被继承的类称为:父类或基类或超类

将继承的类称为子类或者派生类

平时使用最多的就是父类和子类


继承的本质

抽象:将多个类共同的数据或功能抽取出来形成一个基类
继承:从上往下白嫖各个基类里面的资源
"""
对象:数据和功能的结合体
类:多个对象相同的数据和功能的结合体
父类:多个类相同的数据和功能的结合体
ps:类和父类最主要的功能其实就是节省代码
"""
一定要掌握继承的本质 这样以后你才会在代码中自己定义出子类父类

数据和方法的查找顺序(重要)

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

---------------------------------------例-子:---------------------------------
class Student:

school = '清华大学'

def choice_course(self):

print'正在选课')

stu1 = Student()

print(stu1.school)

--------执行结果-----------------
清华大学
-----------------------例子2----------------------------------------

class Student:

school = '清华大学'

def choice_course(self):

print'正在选课')

stu1 = Student()

print(stu1.school)

stu1.school = '北京大学'      

print(stu1.school)

print(Student.school)

--------执行结果----------
清华大学
北京大学
清华大学
  • 单继承的情况下名字查找顺序

  • 1.查找顺序。先查询对象自身,再往产生对象的类里查找。

--------------单继承查找------------------------------

class A:

name = 'from A' 

class B(A):

name = 'from B'

class C(B)

name = 'from C'

class MyClass(C):

name = 'from MyClass'

obj = MyClass()

print (obj.name)
------------例子2----------------------
class A1:
    def func1(self):
        print('from A1 func1')
    def func2(self):
        print('from A1 func2')
        self.func1()  # obj.func1()
class MyClass(A1):
        def func1(self):
            print('from MyClass func1')


obj = MyClass()
obj.func2()
------执行结果------------
from A1 func2
from MyClass func1                 #'''只要涉及到对象查找名字 几乎要回到最开始的位置依次查找'''
  • 总结

image

多继承名字的查找顺序

1.非菱形继承(最后不会归总到我们自定义类上)
	深度优先(每个分支都走到底,再切换)
2.菱形继承	最后归宗到我们一个自定义类的上面
	广度优先(前面几个分支都不会走最后一类,最后一个分支才走)
	也可以使用类点mro()方法查看该类产生的对象名字的查找顺序
主要涉及到对象查找名字,那么几乎都是
对象自身 类 父类

经典类与新式类

  • 经典类
  • 不继承object 或者其子类的类(什么都不就成)

  • 新式类
  • 继承了object 或者其子类的类

-=-======================================================
在python3中所有的类默认都会继承object
	也就意味着python3里面只有新式类
在python2中有经典类和新式类
	由于经典类没有核心的功能 所以到了python3直接砍掉了
	
	
以后我们在定义类的时候  如果没有想要继承的父类 一般推荐以下写法
class MyClass(object):
	pass
目的是为了兼容python2
"""
以后写代码针对object无需关心 知道它的存在即可

派生方法

子类中定义类与父类一模一样的方法并且扩展了该功能>>>派生
classs MyClass(list):
	def append (self,value):
		if value == 'jason':
		print('jason 不能追加')
		super().append(value)
obj = MyClass()
obj.append(111)
obj.append(222)
obj.append('jason')
obj.append(333)
print(obj)

派生的精髓:当新的问题出现,原有程序无法解决,需要对原有程序进行改造
posted @   名字长的像一只老山羊  阅读(91)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示