~继承:
父类(公有的属性和方法)子类(特定的属性和方法)
class 子类(父类1,父类2…)
python支持多继承(一个子类可以有多个父类)
当多继承时。多个父类都有同样的方法,会按照继承列表依次查询(广度优先)
如果显式的写出继承谁,此类就是谁的子类,不写继承于谁则继承于object类(所有类的父类)
继承的传递性:子类可拥有父类和父类的父类的方法
~重写:
子类拥有和父同样的方法,叫重写override
class Person:
def __init__(self,name,age):
self.name=name
self.age=age
def show(self):
print(f'姓名:{self.name}')
print(f'年龄:{self.age}')
class Student(Person):
def __init__(self,name,age,stu_no):
super().__init__(name,age)#调用父类的初始化属性方法
#super(Student,self).__init__(name,age)
self.stu_no=stu_no
def show(self):
super(Student, self).show()
print(f'学号:{self.stu_no}')
stu=Student('张三',18,'jk001')
stu.show()
python中无重载,后面的方法会覆盖前面的方法
dir(ss)#此方法可查看ss对象所对应的类继承的所有属性和方法
#__init__()初始化属性
#__new__()创建对象,开辟内存空间
#__str__()一般自定义类都会重写此方法,利用print直接输出,return一个字符串(也可用print函数里的输出格式),类似于java里的toString()方法
~多态:
在继承的基础上,重写父类的引用指向子类的对象
python不在乎数据类型,在乎有没有这样的行为,不易i的那个要继承,不一定要重写,只要有方法就可
class Pet:
def eat(self):
print('吃东西')
class Dog(Pet):
def eat(self):
print('吃骨头')
class Cat(Pet):
def eat(self):
print('吃小鱼')
class Bird(Pet):
def eat(self):
print('吃虫子')
class Manager:
def Feed(self,pet):#此方法体现多态,所给参数是什么,就输出参数对应的方法
pet.eat()
dog=Dog()
cat=Cat()
bird=Bird()
p1=Manager()
p1.Feed(dog)
p1.Feed(cat)
p1.Feed(bird)
~赋值,复制:
class Grade:
def __init__(self,name)
self.name=name
class Student:
def __init__(self,name,grade):
self.name=name
self.grade=grade
def __str__(self):
return f'{self.name}属于{self.grade}'
grade=Grade()
stu1=Student('jack',grade)
stu2=stu1#赋值运算符,复制后,属于同一内存,修改可变对象会影响原对象,修改不可变对象则无影响
赋值符号:
默认浅拷贝传递对象的引用而已,原始列表改变,被赋值的对象也会做相同的改变
浅拷贝:
对象空间中的数据,不管是可变对象还是不可变对象都把其地址拷贝,或对其属性不新开空间
影响:拷贝后的对象,如果修改可变对象的属性,会影响到原对象
import copy
对象名2=copy.copy(对象名1)
深拷贝:
包含对象里面的自对象的拷贝,所以原始对象的改变不会造成深拷贝里任何子元素的改变
import copy
对象名2=copy.deepcopy(对象名1)
拷贝越深影响越小