学习笔记7-python(构造函数、类属性、实例属性及析构函数

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~~~~~~~")
     # super().__new__(cls)表示创建对象
     return super().__new__(cls)
 def __init__(self,name,age):
     print("init~~~",id(self))
     self.name = name
     self.age = age

a = Animal("大黄",4)
print(a)   # <__main__.Animal object at 0x1043e6cd0>
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("析构函数被调用了~~~~~")

# 1.当对象被定义为全局变量,当程序结束之后,__del__会被自动调用
# print("start")
# p1 = Person()
# print("over")
"""
start
构造函数被调用了
over
析构函数被调用了~~~~~
"""

# 2.当对象被定义为局部变量,当函数调用完毕,__del__会被自动调用
# def func():
#     p1 = Person()
# print("start")
# func()
# print("over")
"""
start
构造函数被调用了
析构函数被调用了~~~~~
over
"""

# 3.当对象被del删除,则__del__会被自动调用
print("start")
p1 = Person()

del p1
print("over")
"""
start
构造函数被调用了
析构函数被调用了~~~~~
over
"""

你可能感兴趣的:(笔记,python,python,学习,开发语言)