今日内容
动静态方法
在类中定义函数有多种特性
class Student:
school_name = 'xx大学'
def func1(self):
print('啊啊啊啊')
#1.在类中直接定义一个函数 默认绑定给类产生的对象 类调用有几个参数就要传几个参数
@classmethod
def func2(cls):
print('我是谁,cls')
#2.@classmethod默认绑定给类 类调用第一个参数就是类自身 对象也可以调用并且会自动将产生该对象的类当做第一个参数传入
@staticmethod
def func3(a):
print('我又是谁',a)
#不管是类还是对象调用抖需要添加参数
obj = Student()
#绑定给对象的方法
obj.func1() #啊啊啊啊
Student.func1(123) #啊啊啊啊
#绑定给类的方法
Student.func2() #我是谁,cls
obj.func2() #我是谁,cls
#静态方法
Student.func3(111) #我又是谁 111
obj.func3(321) #我又是谁 111
面向对象之继承的概念
'''
面向对象三大特性
封装 继承 多态
1.三者中继承是最为核心的
2.封装和多态略微抽象
'''
1.继承的含义:
类与类之间的从属关系
2.继承的目的
类A继承了类B就拥有类B中的所有数据和方法的使用权限
3.继承实操
class Father:
school_name = 'xx大学'
def func1(self):
print('啊啊啊啊')
class Son(Father):
pass
1.在定义类的时候类名后面可以加括号填写其他类名 意味着继承
2.支持多继承 括号可以写多个类名 逗号隔开
class Son(F1, F2, F3):
pass
'''
1.继承其他类 son
我们称之为子类、派生类
2.被继承的 Father
被称为父类
'''
继承的本质
"""
对象:数据与功能的结合体
类:多个对象相同数据和功能的结合体
父类:多个类相同数据和功能的结合体
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'
# pass
#
# 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.多继承情况下名字的查找顺序
菱形继承
广度优先 最后才会找闭环的点
非菱形继承
深度优先 从左往右每条路走完
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())
经典类与新式类
"""
经典类:不继承object或者其子类
新式类:继承object或者其子类
在python2中有经典类和新式类
在python3中只有新式类
"""
ps:以后我们在定义类的时候 如果没有强调其他明确的父类 也可能习惯写obhect兼容
派生方法
子类基于父类某个方法做了扩展
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)