01 第一步 创建类, self指向调用该函数的对象 也就是通过类实例出来的对象 class Person():def __init__(self):self.name = 'zs'self.age = 12def fn(self):print(self)p1 = Person() print(p1) # <__main__.Person object at 0x000002509F331790> print(p1.fn()) # <__main__.Person object at 0x000002509F331790>
02 一个类可以创建多个实例对象 每个实例对象的指针不同也就是内存地址不同
p2 = Person()print(p2) <__main__.Person object at 0x0000022309AD1940>print(p2.fn()) <__main__.Person object at 0x0000022309AD1940>p1 = Person()print(p1) <__main__.Person object at 0x0000022309AD1910>print(p1.fn()) <__main__.Person object at 0x0000022309AD1910>
03 添加获取对象的属性 给对象添加私有的属性和方法
p1 = Person()p1.sex = '男'p1.fn1 = lambda : 10print(p1.fn1()) 10print(p1.sex) 男
04 类的返回值 通过 __str__来实现
class Person():def __init__(self):self.name = 'zs'self.age = 12def fn(self):print(self)def __str__(self):return f'{self.name}-{self.age}'print(Person()) # zs-12 p1 = Person()print(p1) # zs-12
05 类的__del__属性 当代码被执行完 内存空间被释放掉 就会执行这个方法
class Person():def __init__(self):self.name = 'zs'self.age = 12def fn(self):print(self)def __str__(self):return f'{self.name}-{self.age}'def __del__(self):print('我被释放了')Person() # 我被释放了
06 案例 之 地瓜的类
class Digua():def __init__(self):self.time1 = 0self.status = '生' # 0 生 1-10 未熟 11-20 快熟 20以上 熟了self.list = [] # 需要添加的材料def addTime(self,time):self.time1+=timeif self.time1 == 0:self.status = '生'elif 0<self.time1<10:self.status = '未熟'elif 10<self.time1<20:self.status = '快熟'else:self.status = '熟了'def addList(self,cailiao):self.list.append(cailiao)def __str__(self):print(f'地瓜烤了{self.time1}分钟,目前的状态是{self.status},添加的材料有{self.list}')
07 类的继承 class A():def __init__(self):self.name ='zs'class B(A):passc = B() print(c.name) # zs
08 类的属性和方法的覆盖 , 如果同时继承多个父类,有重名的打印的是第一个父类
class A():def __init__(self):self.name = 'zs'def fn(self):print('我是A')class B():def __init__(self):self.name = 'ls'def fn1(self):print('我是B')class C(A,B):passc = C() print(c.name) # zs
09 自用拥有的属性和方法与父级重名以自身的为主
class A():def __init__(self):self.name = 'zs'class B(A):def __init__(self):self.name = 'ls'b = B()print(b.name) # ls
10 在子类如何调用父类的属性和方法呢:
第一种方式 在子类中调用需要先调用父类的 __init__(self) 的方法 再调用父类的属性或者方法
class B(A):def __init__(self):self.name = 'ls'def fn(self): A.__init__(self) # 在这里使用父类的属性return A().nameb = B()print(b.fn()) # zs
11 定义私有的属性和方法 以__开头
class A():def __init__(self):self.__name = 'zs'self.age = 20def __fn(self):print('私有的方法')a = A() print(a.__name) # 报错 print(a.age) # 20
12 类的多态
class Dog():def fn(self):print('wangwnag')class Person():def fn(self):print('你好')class Lei():def fn(self,lei):return lei.fn()dog = Dog() person = Person() lei = Lei() lei.fn(dog) # wangwang lei.fn(person) # 你好
13 类方法的使用场景。 如访问私有类属性的时候 定义类的方法 使用@claasmethod
class A():__tools = 'wo'@classmethoddef fn(cls):print(cls.__tools)def fn1(self):print(self.__tools)a = A() a.fn1() a.fn()
14 静态方法既可以类访问也可以对象访问
class A():__tools = 'wo'def fn1(self):print(self.__tools)@staticmethoddef fn():print('123')A.fn() a =A() a.fn()
15 捕获错误
try:print(1/0) except:print('出现了错误') else:print('没有错误') finally:print('不管有没有错都打印')
try:print(1/0) except (NameError,ZeroDivisionError): # 捕获指定的错误print('出现了错误') else:print('没有错误') finally:print('不管有没有错都打印')
try:print(1/0) except (NameError,ZeroDivisionError) as error: # 捕获指定的错误print(error) # 打印报错信息 else:print('没有错误') finally:print('不管有没有错都打印')
16 模块的导入方式:
import 模块名
from 模块名 import 功能名
from 模块名 import *
from 模块名 as 别名
from 模块名 import 功能名 as 别名
17 在文件中定义导出的方法 使用 __all__ = ['导出的方法']
__all__ = ['test']
test ():
print(‘123’)
18 创建包 包会自创一个__init__的文件
在这个文件中可以定义导出的模块列表
正常导入 import 包名.文件名 使用的时候 包名.文件名.方法()
18 __dict__将实例对象 转化为字典的形式{}
class A():def __init__(self):self.age = 20a = A() print(a.__dict__) # {'age': 20}
19 eval() 将字符串变为list
a = "[[1,2], [3,4], [5,6], [7,8], [9,0]]"print(eval(a)) # [[1, 2], [3, 4], [5, 6], [7, 8], [9, 0]]b = "[{'bane':'123'},{'age':'12'}]" print(eval(b)) # [{'bane': '123'}, {'age': '12'}]