# 继承
'''
让子类直接拥有父类的属性和方法的过程就是继承
子类 --- 继承者
父类 --- 被继承者(超类)
'''
# 语法
'''
class 子类(父类1,父类2,父类3,...):
类的说明文档
类的内容
说明:
默认情况下,类继承object:
class 类名:== class 类名(object):
python中支持多继承
'''
class Person:
num = 61
def __init__(self, name='张三', age=18, gender='男'):
self.name = name
self.age = age
self.gender = gender
def eat(self, food='馒头'):
print(f'{self.name}在吃{food}')
@staticmethod
def func1():
print('静态方法')
class Student(Person):
pass
# python中子类继承父类可以直接拥有父类所有的属性和方法
print(Student.num) # 61
sut = Student()
sut.eat('包子') # 张三在吃包子
print(sut.name, sut.age) # 张三 18
print(sut.__dict__) # {'name': '张三', 'age': 18, 'gender': '男'}
# 在子类中添加内容
'''
添加新的类属性和方法
在子类直接定义
添加新的对象属性
需要在子类的__init__方法中通过super()去调用父类的__init__方法
super()只能在对象方法和类方法中使用
'''
class Animal:
num = 100
def __init__(self, age=0, gender='雌'):
self.age = age
self.gender = gender
def eat(self, food='草'):
print(food)
@staticmethod
def func1():
print('静态方法')
class Cat(Animal):
# 添加类属性
x = 'abc'
# 重写类属性
num = 10
# 子类添加新的对象属性需要用super().__init__()来调用父类的对象属性
def __init__(self, name='花花'):
# super().父类方法 --- 用来保留父类方法
# 在子类对象方法调用父类对象方法,在子类类方法调用父类类方法,在静态方法不能使用,
super().__init__()
self.name = name
# 添加对象方法
def play(self):
print('猫在玩儿毛线')
# 重写对象方法
def eat(self, food='鱼'):
print(f'猫在吃{food}')
cat = Cat()
print(cat.num, cat.x) # 10 abc
cat.eat() # 猫在吃鱼
# 练习:定义一个教师类,在Person的基础上添加:职称和工龄两个属性
class Person:
def __init__(self, name, age=20, gender='男'):
self.name = name
self.age = age
self.gender = gender
class Tercher(Person):
def __init__(self, name, gender, rank, work_age=1, age=18):
super().__init__(name, gender=gender, age=age)
self.rank = rank
self.work_age = work_age
t1 = Tercher(name='张三', gender='男', rank='老师', work_age=2)
t2 = Tercher(name='李四', gender='女', rank='老师', work_age=5, age=30)
print(t1.__dict__) # {'name': '张三', 'age': 18, 'gender': '男', 'rank': '老师', 'work_age': 2}
print(t2.__dict__) # {'name': '李四', 'age': 30, 'gender': '女', 'rank': '老师', 'work_age': 5}
内存管理
定义变量保存数据的时候,系统会自动在内存中开辟空间保存数据(空间大小根据数据大小确定)
默认情况下,使用的数据如果之前保存过,还是会重新申请新的内存保存这个数据,字符串和数字例外
一个数据是否需要释放,就看这个数据引用计数是否为0(是否有引用),不为0不会销毁
内存管理
定义变量保存数据的时候,系统会自动在内存中开辟空间保存数据(空间大小根据数据大小确定)
默认情况下,使用的数据如果之前保存过,还是会重新申请新的内存保存这个数据,字符串和数字例外
一个数据是否需要释放,就看这个数据引用计数是否为0(是否有引用),不为0不会销毁
拷贝
copy() 浅拷贝 和原数据一起指向子串地址,原数据子串发生改变,浅拷贝的数据子串会跟着变
deepcopy() 深拷贝 完全拷贝,原数据发生改变不会影响深拷贝的数据
from copy import deepcopy
list1 = [1, 2, 3, [4, 5, 6]]
list2 = list1.copy()
list3 = deepcopy(list1)
print(list1, list2, list3)
list1[3].append('我是新添加的元素')
# list1:[1, 2, 3, [4, 5, 6, '我是新添加的元素']]
# list2:[1, 2, 3, [4, 5, 6, '我是新添加的元素']]
# list3:[1, 2, 3, [4, 5, 6]]
print(f'list1:{list1}\nlist2:{list2}\nlist3:{list3}')