Python类

下## 创建方法

class Student:
    pass

类的组成

类属性

类中方法外定义的变量,被该类的所有对象所共享

实例方法

类里面定义的函数

class Student:
    def eat(self):  # 自带self
        print("eat")

静态方法

使用 @staticmethod 来修饰,使用类名直接访问的方法

    @staticmethod
    def drink():  # 不带self
        print("drink")

使用类名.方法名直接调用

类方法

使用了@classmethod来修饰,使用类名直接访问的方法

	@classmethod
    def cm(cls):  # 自带cls
        print("clf")

使用类名.方法名直接调用

初始化定义

	    def __init__(self, name, age):
        self.name = name   # self.name称作实体属性,将局部变量name赋值给实体属性
        self.age = age

类对象创建

实例名 = 类名

类对象调用

1.对象名.方法()
2.类名.方法(类对象)

面向对象三大特征

封装

封装:提高程序的安全性
1.将数据(属性)和行为(方法)包装到类对象中。在方法内部对属性进行操作,在类对象的外部调用方法。无需关心方法内部的具体细节,从而隔离复杂度。
2.在Python中没有专门的修饰符用于属性的私有,若该属性不希望类对象外访问,前面使用两个_。(但可以使用 _类名__属性名访问)

继承

语法格式

class 子类类名(父类1,父类2...):
	pass

若没有任何继承则默认object

子类创建

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def info(self):
        print(self.name, self.age)

class Student(Person):
    def __init__(self, name, age, stu_no):
        super().__init__(name, age)   # 从父类中继承
        self.stu_no = not stu_no

class Teacher(Person):
    
    def __init__(self, name, age, teacher_of_age):
        super().__init__(name, age)  # 从父类中继承
        self.teacher_of_age = teacher_of_age

创建实例对象

stu1 = Student('法外狂徒张三', 20, 10001)
teacher = Teacher('李四', 30, 4)

stu1.info()
teacher.info()

继承方法重写

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def info(self):
        print(self.name, self.age)

class Student(Person):
    def __init__(self, name, age, stu_no):
        super().__init__(name, age)
        self.stu_no =stu_no
    def info(self):
        suoer().info()
        print(self.stu_no)

class Teacher(Person):

    def __init__(self, name, age, teacher_of_age):
        super().__init__(name, age)
        self.teacher_of_age = teacher_of_age
    def  info(self):  
        super().info()
        print(self.teacher_of_age)

stu1 = Student('法外狂徒张三', 20, 10001)
teacher = Teacher('李四', 30, 4)

多态

多态:具有多种形态
指的是,即使不知道一个变量所用的对象是什么类型,仍然可以通过这个变量调用方法,在运行过程中根据变量所引用对象的类型,动态决定调用哪个对象中的方法

对象创建和初始化

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def info(self):
        print(self.name, self.age)

class Student(Person):
    def __init__(self, name, age, stu_no):
        super().__init__(name, age)
        self.stu_no =stu_no
    def info(self):
        print(self.name)
        print(self.age)
        print(self.stu_no)

class Teacher(Person):

    def __init__(self, name, age, teacher_of_age):
        super().__init__(name, age)
        self.teacher_of_age = teacher_of_age
    def  info(self):  # 方法被重写,因此希望执行父类中的方法,需要重新写
        print(self.name)
        print(self.age)
        print(self.teacher_of_age)

stu1 = Student('法外狂徒张三', 20, 10001)
teacher = Teacher('李四', 30, 4)

输出
object这个类对象的id为140719950899232
Person这个类的对象的id为1942592195624
__new__被调用执行了,cls的id值为1942592195624
创建的对象id为1942617339208
__init__被调用了,self的id值为1942617339208
p1这个Person类的实例对象的id为1942617339208

可以看到__new__ 创建的对象就是类中创建的self和实例对象p1

执行过程及参数传递

Python类_第1张图片

类的赋值与浅拷贝

变量的赋值操作

只是形成两个变量,实际上还是指向同一个对象

浅拷贝

Python拷贝一般都是浅拷贝,拷贝时,对象包含的子对象内容不拷贝,因此,源对像会引用同一个子对象

class CPU:
    pass

class Disk:
    pass

class Computer:
    def __init__(self, cup, disk):
        self.cpu = cpu
        self.disk = disk

cpu = CPU()
disk = Disk()

computer = Computer(cpu, disk)

# 浅拷贝

import copy

computer2 = copy.copy(computer)
print(computer, computer.cpu, computer.disk)
print(computer2, computer2.cpu, computer2.disk)

输出
在这里插入图片描述

浅拷贝原理示意图

Python类_第2张图片

深拷贝

使用拷贝,模块的deepcopy函数,递归拷贝对象中包含的子对象墩号源对象和拷贝对象所有的子对象函数也不同

computer3 = copy.deepcopy(computer)
print(computer3, computer3.cpu, computer3.disk)

输出
在这里插入图片描述

你可能感兴趣的:(basis,python)