day25 面向对象高阶

发布时间 2023-12-23 21:10:48作者: Junior_bond

复习
@classmethod方法 类内部使用@classmethod修饰器的方法就是绑定到类的方法→类方法 类方法可以直接通过类调用而无需实例化

def __init__(self): 类的构造函数 创建一个实例(对象)时自动调用

在py中self和cls只是约定俗成的命名,没有特殊的含义
self通常作为对象方法的第一个参数,指代对象本身
cla通常作为类方法的第一个参数,指代类本身

class Worker:

def __init__(self, name, age, height, salary):
self.name = name
self.age = age
self.height = height
self.salary = salary

@classmethod
def str_handler(cls, string):
name, age, height, salary = string.split('/')
# 将传入的字符串以/分割产生列表,一一对应
return cls(name, age, height, salary)
# 这里return返回的是一个类对象
# 要注意return返回值可以被变量接收,接收后就成为类对象了
A = 'Jack/20/1.75/1000'
a = Worker.str_handler(A)
print(a)
b= Worker('yjw',26,175,400000)
print(b)

打印结果:
<__main__.Worker object at 0x000002CB14E812D0>
<__main__.Worker object at 0x000002CB14E81350>

 

 

单例模式:
为了实现同一种调用方式得到的对象是一样的
class Vio:
def __init__(self,shape,width):
self.shape = shape
self.width = width

w1=Vio('water',35)
print(w1)
w2=Vio('water',35)
print(w2)


打印结果:
<__main__.Vio object at 0x000001A1BA4B0F90>
<__main__.Vio object at 0x000001A1BA4B1110> #直接调用即使初始化参数一样但实际上不是同一个对象

利用装饰器实现单例模式:
SHAPE='swater'
WIDTH='36'
def deco(cls):
instance=cls(SHAPE,WIDTH)#初始化对象
def wrapper(*args, **kwargs):
if len(args)==0 and len(kwargs)==0:
return instance#这里千万不能写return cls(SHAPE,WIDTH)
else:
return cls(*args, **kwargs)
return wrapper
@deco
class Vio:
def __init__(self,shape,width):
self.shape = shape
self.width = width

w1=Vio()
w2=Vio()
print(w1==w2)
print(w1)
print(w2)

打印结果:
True
<__main__.Vio object at 0x0000023F704D1850>
<__main__.Vio object at 0x0000023F704D1850>


异常处理:
try:
1/0
except Exception as e:
print(e)

打印结果:
division by zero

raise 主动抛出异常