day25 continued

发布时间 2023-12-26 20:31:10作者: Junior_bond

类与对象复习:

类的派生:在自己的init里面加入父类的init
class Parent():
def __init__(self,name):
self.name = name
class Son(Parent):
def __init__(self,age,name):
super().__init__(name)
self.age = age

son1=Son(18,'yyy')
print(son1.__dict__)


打印结果:
{'name': 'yyy', 'age': 18}

类的组合:类对象可以作为引用值、参数、返回值、容器的元素

类的封装:在需要封装的属性或者方法前面加__,类内部可以访问,类外部不行

类与对象的绑定方法与非绑定方法:
没有被任何装饰器装饰的就是对象的绑定方法,约定俗成的第一个参数为self(实例化对象),自动传参;类也能调用对象的绑定方法,但是self需要传参
被@classmethod装饰器装饰的就是类的绑定方法,约定俗成的第一个参数是cls(类本身),自动传参;对象也能调用类的绑定方法,但cls还是类本身
被@staticmethod装饰器装饰的就是非绑定的方法,就是一个普通的函数。

 

isinstance与issubclass:
class Parent():
def __init__(self,name):
self.name = name
class Son(Parent):
def __init__(self,age,name):
super().__init__(name)
self.age = age

son1=Son(18,'yyy')

print(isinstance(son1,Parent))#会检测父类
print(issubclass(Son,Parent))

打印结果:
True
True

 

 

反射:
hasattr
getattr
setattr
delattr

 

__call__的触发条件:对象加括号
class Foo():
def __init__(self,name):
self.name = name
def __call__(self, *args, **kwargs):
print("__call__被触发啦")

Foo('yjl')()

打印结果:
__call__被触发啦


__new__(cls):

只要是面向对象的编程语言,类的实例化一定包含两个步骤:
(1)在内存中创建对象,即开辟一块内存空间来存放类的实例化对象(Instance);
(2)初始化对象,即给实例的属性赋予初始值。

构造方法包括创建对象和初始化对象,在python当中,分为两步执行:先执行__new__方法,然后执行__init__方法;
__new__是在实例创建之前被调用的,它的任务是创建实例然后返回该实例
__init__是当实例对象创建完成后被调用的,然后设置对象属性的一些初始值。

__new__在__init__之前被调用,__new__的返回值(obj)将传递给__init__方法的第一个参数(self),然后__init__给这个实例设置一些参数,__init__不需要返回值


如果__new__方法返回None,则__init__方法不会被执行,所以__new__必须要有返回值。除此以外,创建obj时只能调用父类中的__new__方法(如object),而不能调用毫无关系的类的__new__方法。


__new__至少要有一个参数cls,代表要实例化的类,此参数在实例化时由Python解释器自动提供,也可手动添加

 

我们可以将类比画画,__new__方法提供一张白纸,__init__方法在纸上画画,但归根到底是同一张纸

 

class Foo():
def __new__(Foo, age,name):
obj=super().__new__(Foo)
print('obj 的id:',id(obj))
print(obj.__dict__)
return obj
def __init__(self,age,name):
print(self.__dict__)
self.age=age
self.name=name
print(self.__dict__)
print('self的id:',id(self))

f1=Foo(100,'yyy')
print('f1 的id:',id(f1))
print(f1.__dict__)

打印结果:
obj 的id: 2867407950352
{}
{}
{'age': 100, 'name': 'yyy'}
self的id: 2867407950352
f1 的id: 2867407950352
{'age': 100, 'name': 'yyy'}

 

 


元类:
元类是来造类的 type是Python中内建元类
1. 道 即是 type
2. 一 即是 metaclass(元类,或者叫类生成器)
3. 二 即是 class(类,或者叫实例生成器)
4. 三 即是 instance(实例)
5. 万物 即是 实例的各种属性与方法,我们平常使用python时,调用的就是它们。
元类()→类
元类()()→对象
类的组成:类名/父类们/类体代码名称空间

class Mymeta(type):
def __init__(self, name, bases, dct):#牢牢记住这里的self是Mymeta的实例即,类
#控制类产生
super().__init__(name, bases,dct)

def __call__(self, *args, **kwargs):
obj=super().__new__(self,*args, **kwargs)
self.__init__(obj,*args,**kwargs)


return obj