从入门到入狱-------继承和内存管理

# 继承
'''
让子类直接拥有父类的属性和方法的过程就是继承
子类 --- 继承者
父类 --- 被继承者(超类)
'''
# 语法
'''
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}')

猜你喜欢

转载自blog.csdn.net/weixin_44628421/article/details/109253891