作用: 在类实例化对象的过程当中初始化实例属性
触发时机:实例化对象,初始化的时候触发
功能:为对象添加成员
参数:参数不固定,至少一个self参数
返回值:无
class Hero(object):
# 在类实例化对象的过程中,会自动调用__init__魔术方法
def __init__(self): # __init__是一个实例方法 self代表实例对象本身
print("__init__ 被调用")
# 作用:在实例化对象的过程当中对实例属性进行初始化
# 实例属性就是属于实例对象的变量,可以通过 实例对象.属性名称 来访问,如name....
self.name = '孙尚香'
self.hp = 200
self.atk = 800
self.armor = 100
def move(self):
# 在类的内部,可以通过 self.属性名称 来获取或者修改 实例属性
# 在类的内部, 可以通过 self.方法名称([参数列表]) 来调用实例方法
print("%s 开始移动,发起攻击" % self.name)
print("hp:%d" % self.hp)
h1 = Hero() # __init__ 被调用
print(h1.name) # 在类的外部, 通过 实例对象.属性名称 来访问 孙尚香
h1.hp = 100
print(h1.hp) # 100
h1.move() # 孙尚香开始移动,发起攻击 hp:100
h2 = Hero() # __init__ 被调用
print(h2.name) #孙尚香
h2.move() # 孙尚香开始移动,发起攻击 hp:200
class Hero(object):
# 在类实例化对象的过程中,会自动调用__init__魔术方法
def __init__(self, name, hp, atk, armor=80): # __init__是一个实例方法 self代表实例对象本身
print("__init__ 被调用")
# 作用:在实例化对象的过程当中对实例属性进行初始化
# 实例属性就是属于实例对象的变量, 可以通过 实例对象.属性名称 来访问
self.name = name
self.hp = hp
self.atk = atk
self.armor = armor
def move(self):
# 在类的内部,可以通过 self.属性名称 来获取或者修改 实例属性
# 在类的内部, 可以通过 self.方法名称([参数列表]) 来调用实例方法
print("%s 开始移动,发起攻击" % self.name)
h1 = Hero('孙尚香', 200, 100, 200) # __init__ 被调用
print(h1.name) # 孙尚香
h2 = Hero('程咬金', 400, 200, 100) # __init__ 被调用
print(h2.name) # 程咬金
h3 = Hero(name='程咬金', hp=400, atk=200, armor=100) # __init__ 被调用
print(h3.name) # 程咬金
h4 = Hero('后羿', 300, atk=300)
print(h4.name, h4.armor) # 后羿 300
1. 在实例化对象的时候会自动调用
2. new方法会在init方法之前执行,因为new的返回值是init方法的参数
功能:控制对象的创建过程
参数: 至少一个cls接受当前的类,其他根据情况决定
返回值:通常返回对象或None
3. new方法必须要有返回值,因为new方法的作用就是创建并且返回实例对象,__init__()是初始化实例对象
4. new方法会将类作为第一个参数,通过这个类来创建实例对象
(1) 基本使用
class TestTest(object):
a = 100
obj = TestTest()
class Test(object):
def __init__(self):
print("__init__ 被执行!")
def __new__(cls, *args, **kwargs): # cls 是类对象, 等价于 Test
print("__new__ 被执行")
print(cls) #
# 1.返回本类对象 类.成员方法(类)
# return object.__new__(cls) # 创建实例对象 并且返回
# 2.返回其它类的对象
# return obj
# 3.不返回对象 None
return None
print('Test:', Test)
t = Test()
t2 = Test()
print(t2.a) # 100 对应上面的 2返回其它类的对象
(2) __new__ 触发时机要快于 __init__
"""
__new__ 创建对象
__init__ 初始化对象
"""
class MyClass():
def __new__(cls):
print(1)
return object.__new__(cls)
def __init__(self):
print(2)
obj = MyClass() # 1 2
(3) __new__的参数要和__init__参数一一对应
class Boat():
def __new__(cls, name):
return object.__new__(cls)
def __init__(self, name):
self.name = name
obj = Boat("万里阳光号")
print(obj.name) # 万里阳光号
# 使用收集参数进行改造
class Boat():
# *args,**kwargs 可以收集多余的所有参数
def __new__(cls, *args, **kwargs):
return object.__new__(cls)
def __init__(self, name, type):
self.name = name
self.type = type
obj = Boat("万里阳光号", "破木头做的")
print(obj.name, obj.type)
(4) __new__和__init__之间的注意点
如果__new__ 没有返回对象或者返回的是其他类的对象,不会调用构造方法.
只有在返回自己本类对象的时候,才会调用构造方法.
class Children():
def __new__(cls,*args,**kwargs):
return obj2
# pass
def __init__(self,name,skin):
print("构造方法被触发 ... ")
# self.name = name
# self.skin = skin
obj = Children("灭霸","紫薯")
# print(obj.name) error
# print(obj.skin) error
在对象被销毁的时候会自动调用
触发时机:当对象被内存回收的时候自动触发[1.页面执行完毕回收所有变量 2.所有对象被del的时候]
功能:对象使用完毕后资源回收
参数:一个self接受对象
返回值:无
eg1: (1)基本语法
class Lion():
def __init__(self, name):
self.name = name
def __del__(self):
print("析构方法被触发 ... ")
# 触发方式一: 页面执行完毕回收所有变量
obj1 = Lion("辛巴") # 析构方法被触发 ...
# 触发方式二: 所有对象被del的时候
obj2 = obj1
obj3 = obj1
print(obj2, obj1, obj3) # <__main__.Lion object at 0x00000221DBC5A400> <__main__.Lion object at 0x00000221DBC5A400> <__main__.Lion object at 0x00000221DBC5A400>
print("<====start===>")
del obj1
del obj2
del obj3
print("<====end===>")
# <====start===>
# 析构方法被触发 ...
# <====end===>、
eg2: 模拟文件操作
# (2) 模拟文件操作
import os
class ReadFile():
# 根据文件是否存在,创建对象
def __new__(cls,filename):
if os.path.exists(filename):
return object.__new__(cls)
else:
print("抱歉,没有这个文件")
# 打开文件
def __init__(self,filename):
self.fp = open(filename,mode="r",encoding="utf-8")
# 关闭文件
def __del__(self):
self.fp.close()
# 读取文件
def readcontent(self):
return self.fp.read()
obj = ReadFile("0.py")
print(obj.readcontent())
触发时机: 使用print(对象)或者str(对象)的时候触发
功能: 解释对象
参数: 一个self接受当前对象
返回值: 必须返回字符串类型
class Hero(object):
# 在类实例化对象的过程中,会自动调用__init__魔术方法
def __init__(self, name, hp, atk, armor=80): # __init__是一个实例方法 self代表实例对象本身
print("__init__ 被调用")
# 作用:在实例化对象的过程当中对实例属性进行初始化
# 实例属性就是属于实例对象的变量, 可以通过 实例对象.属性名称 来访问
self.name = name
self.hp = hp
self.atk = atk
self.armor = armor
def move(self):
# 在类的内部,可以通过 self.属性名称 来获取或者修改 实例属性
# 在类的内部, 可以通过 self.方法名称([参数列表]) 来调用实例方法
print("%s 开始移动,发起攻击" % self.name)
# __str__方法必须返回一个字符串
# 通过print函数打印对象的时候,会打印__str__魔术方法的返回值
# str()函数对对象进行强制类型转换的时候,也会使用__str__魔术方法的返回值
def __str__(self):
return f"{self.name}-{self.hp}-{self.atk}-{self.armor}"
h1 = Hero("孙尚香", 200, 100, 120)
print(h1)
s1 = str(h1)
print(s1, type(s1))
结果:
__init__ 被调用
孙尚香-200-100-120
孙尚香-200-100-120
1. new 是 类方法,第一个参数是cls
init 是实例方法,第一个参数是self
2. 功能不一样
3. 参数不同
4.执行顺序不同
触发时机: 使用repr(对象)的时候触发
功能: 查看对象,与魔术方法__str__相似
参数: 一个self接受当前对象
返回值: 必须返回字符串类型
class Mouse():
gift = "偷油吃"
def __init__(self,name):
self.name = name
def mouse_gift(self):
return "老鼠叫{},老鼠会{}".format(self.name,self.gift)
def __repr__(self):
return self.mouse_gift()
# 系统底层默认把__repr__方法赋值给__str__方法,所以通过print或者str强转可以触发;
# __str__ = __repr__
jerry = Mouse("杰瑞")
# res = repr(jerry)
# print(res)
# 可以触发
# print(jerry)
res = str(jerry)
print(res)
7. __call__
触发时机:把对象当作函数调用的时候自动触发
功能: 模拟函数化操作
参数: 参数不固定,至少一个self参数
返回值: 看需求
与类相关的魔术属性
# __dict__ 获取对象或类的内部成员结构
# __doc__ 获取对象或类的内部文档
# __name__ 获取类名函数名
# __class__ 获取当前对象所属的类
# __bases__ 获取一个类直接继承的所有父类,返回元组
# ### 魔术属性
class Man():
pass
class Woman():
pass
class Sasuke(Man,Woman):
"""
描述: 佐助这个的天生属性,技能
成员属性: __eye skin
成员方法: skylight __moonread
"""
__eye = "血轮眼->万花筒->轮回眼"
skin = "白色"
def skylight(self , myfunc):
print("使用天照,一团黑色的火焰 ... 恐怖如斯")
res = myfunc.__name__
print(res , type(res) )
def __moonread(self):
print("使用月读,让敌人拉入到幻术空间,被施法者掌握")
obj = Sasuke()
# __dict__ 获取对象或类的内部成员结构
dic = Sasuke.__dict__
dic = obj.__dict__
print(dic)
# __doc__ 获取对象或类的内部文档
print(Sasuke.__doc__)
print(obj.__doc__)
# __name__ 获取类名函数名
def func343434():
print("佩恩出场时,使用一手地爆天星,技惊四座,点燃所有观众")
obj.skylight(func343434)
# __class__ 获取当前对象所属的类
print(obj.__class__)
# __bases__ 获取一个类直接继承的所有父类,返回元组
print(Sasuke.__bases__)