下## 创建方法
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拷贝一般都是浅拷贝,拷贝时,对象包含的子对象内容不拷贝,因此,源对像会引用同一个子对象
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)
输出
使用拷贝,模块的deepcopy函数,递归拷贝对象中包含的子对象墩号源对象和拷贝对象所有的子对象函数也不同
computer3 = copy.deepcopy(computer)
print(computer3, computer3.cpu, computer3.disk)
输出