01 第一步 创建类, self指向调用该函数的对象 也就是通过类实例出来的对象 class Person(): def __init__(self): self.name = 'zs' self.age = 12 def 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 : 10 print(p1.fn1()) 10 print(p1.sex) 男
04 类的返回值 通过 __str__来实现
class Person(): def __init__(self): self.name = 'zs' self.age = 12 def 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 = 12 def 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 = 0 self.status = '生' # 0 生 1-10 未熟 11-20 快熟 20以上 熟了 self.list = [] # 需要添加的材料 def addTime(self,time): self.time1+=time if 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): pass c = 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): pass c = 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().name b = B() print(b.fn()) # zs
11 定义私有的属性和方法 以__开头
class A(): def __init__(self): self.__name = 'zs' self.age = 20 def __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' @classmethod def 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) @staticmethod def 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 = 20 a = 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'}]