1、__init__和__new__的区别是什么?
区别 | __new__ | __init__ | 顺序 | 先执行 | 后执行 | 绑定参数 | cls | self | 返回值 | 实例对象 | None |
new创建了实例,init修改了实例
扩展:new可以不返回对象,这种情况下,实例化的结果是None
class A:
def __new__(cls, *args, **kwargs):
# 返回类的实例对象
print("我是new 我自动执行了")
return super().__new__(cls) # 不知道怎么实例化,交给父类处理
def __init__(self):
print("我是init 我自动执行了")
a = A()
print(a)
2、实例方法,类方法、静态方法的区别
区别 | 实例方法 | 类方法 | 静态方法 | 装饰器 | 无 | @classmethod | @staticmethod | 绑定参数 | self | cls | 无 |
?
def kally(): # 函数
pass
class A:
def set_name(self): # 方法
print(self)
@staticmethod
def set_name1(self):
print(self)
@classmethod
def set_name2(cls):
print(cls)
print(A().set_name)
print(A().set_name1)
print(A().set_name2)
A().set_name 方法
实例方法:类当中的普通函数,实例化后,第一个参数强制传递实例对象
类方法:类当中的普通函数,加了装饰器后,第一个参数 强制传递类
静态方法:类当中的普通函数,加了装饰器后,不强制传递参数
普通函数,不强制传递参数
A.set_name 函数
kally 函数
A().set_name1 函数 类当中静态函数,实例化后,变为函数
3、装饰器是什么,有什么用?
装饰器,一句话描述:返回函数的函数
本质:将被装饰对象作为参数传递给装饰器,并用返回值覆盖原被装饰对象
def decorator(f):
return print
@decorator
def b():
pass
上面的这段代码 等于 下面的这段代码
def decorator(f):
return print
def b():
pass
b = decorator(b)
用处:修改和替换被装饰对象时,不需要修改原对象的代码。因为原对象是被作为参数传递的
?b作为参数传递给d,返回覆盖原来的b
装饰器:不修改原函数的情况下,给原函数增加功能。这样子的描述对吗?不对(见上面的返回print函数)
但是下面还是给一个这个样子描述的例子:
def f(func):
def a():
print("start")
res = func()
print(f"res = {res}")
print("end")
return a
@f
def b():
print("123")
return 1 + 1
b()
严谨说是:返回另一个可调用对象的可调用对象
可调用对象:
--函数
--类
--实例对象 调用__call__方法
|