1.构造函数
先创建对象,然后使用直接赋值【动态绑定属性】方式给对象绑定属性,可以使用,但是代码比较繁杂,一般情况下,很多类倾向于将对象创建为有初始状态的,常规用法中,在类中可以定义一个函数,名称为__init__,该特殊的函数被称为构造函数,主要用于给对象的数据做出初始化
强调:构造函数包括__new__和__init__
注意:在Python中,以__xxx__方式命名的函数被称为魔术函数/魔术方法,这类函数在使用的时候无需手动调用,在进行某个操作的时候会自动调用
构造函数,也被称为构造器,指的是当创建对象的时候,被自动调用的函数
语法:
def __new__(cls,*args,**kwrags):
pass
def __init__(self):
pass
1.1工作原理
class Animal():
__slots__ = ('name','age')
def __new__(cls, *args, **kwargs):
print("new~~~~~~~")
return super().__new__(cls)
def __init__(self,name,age):
print("init~~~",id(self))
self.name = name
self.age = age
a = Animal("大黄",4)
print(a)
print(id(a))
"""
总结:
a.真正意义上,构造函数包含__new__和__init__
b.在实际开发中,常用__init__,因为__new__在类中没有定义,当创建对象的时候仍然会自动调用
c.__new__:表示创建对象,该函数的返回值就是创建出来的对象
例如:a = Animal("大黄",4),a指向__new__的返回值
__init__:表示初始化对象,系统会自动将__new__的返回值【创建的对象】会自动传参给__init__中的self,
同时,将需要初始化的值传参给__init__中的其他参数,完成对象初始化的过程
d.构造函数中,当创建对象的时候,都是先调用__new__,然后才调用__init__
"""
1.2类属性和实例属性
【面试题】简述类属性【类的字段】和实例属性【对象属性,对象的字段】的区别 1.定义位置不同:类属性直接定义在类中,实例属性定义在__init__中或在类的外面直接动态绑定定义 2.访问方式不同:类属性可以通过类名或对象访问,而实例属性只能通过对象访问 3.访问优先级不同:当类属性和实例属性重名时,通过对象访问,优先访问的是实例属性 4.在内存中出现的时机不同:类属性优先于实例属性出现在内存中,类属性随着类的加载而出现,实例属性是对象创建完毕之后才会出现 5.使用场景不同:类属性用于表示多个对象共享的数据,实例属性表示每个对象特有的数据
2.析构函数
"""
【面试题】析构函数__del__调用的时机
当对象被销毁的时候
"""
class Person():
def __init__(self):
print("构造函数被调用了")
def __del__(self):
print("析构函数被调用了~~~~~")
"""
start
构造函数被调用了
over
析构函数被调用了~~~~~
"""
"""
start
构造函数被调用了
析构函数被调用了~~~~~
over
"""
print("start")
p1 = Person()
del p1
print("over")
"""
start
构造函数被调用了
析构函数被调用了~~~~~
over
"""
|