入国から刑務所継承とメモリ管理まで

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