__new__()构造器
范例:使用“__new__()”方法
# coding : utf-8
class Message: # 默认object子类
def __new__(cls, *args, **kwargs): # 特殊方法
print("【new】cls = %s、args = %s、kwargs = %s" % (cls,args,kwargs)) # 提示信息
return object.__new__(cls) # 如果不返回此内容构造方法将不会执行
def __init__(self, **kwargs): # 构造方法
print("【init】kwargs = %s" % kwargs) # 输出构造方法接收关键字参数
def main(): # 主函数
msg = Message(title="yootk",content="优拓软件学院") # 实例化Message类对象
if __name__ == "__main__": # 判断程序执行名称
main() # 调用主函数 |
获取对象信息
范例:观察默认状态下的对象输出
# coding : utf-8
class Message: # 默认object子类
def __init__(self,content): # 构造方法初始化内容
self.__content = content # 属性赋值
def main(): # 主函数
msg = Message("www.yootk.com") # 实例化类对象
print(msg) # 直接输出对象
print(msg.__str__()) # 转为字符串输出 if __name__ == "__main__": # 判断程序执行名称
main() # 调用主函数 |
范例:覆写“__str__()”方法
# coding : utf-8
class Message: # 默认object子类
def __init__(self,content): # 构造方法初始化内容
self.__content = content # 属性初始化
def __str__(self): # 覆写object类方法
return "【__str__()】%s" % self.__content # 获取对象信息
def main(): # 主函数
msg = Message("www.yootk.com") # 实例化类对象
print(msg) # 直接输出对象
if __name__ == "__main__": # 判断程序执行名称
main() # 调用主函数 |
范例:覆写“__repr__()”方法
# coding : utf-8
class Message: # 默认object子类
def __init__(self,content): # 构造方法初始化内容
self.__content = content # 覆写特殊方法
def __str__(self): # 覆写object类方法
return "【__str__()】%s" % self.__content # 返回对象信息
def __repr__(self): # 覆写特殊方法
return "【__repr__()】%s" % self.__content # 返回对象信息
def main(): # 主函数
msg = Message("www.yootk.com") # 实例化类对象
print(str(msg)) # 不使用str()函数也表示调用“__str__()”
print(repr(msg)) # 必须使用repr()函数才可以调用“__repr__()”
if __name__ == "__main__": # 判断程序执行名称
main() # 调用主函数 |
范例:通过方法引用简化重复代码
class Message: # 自定义类
def __init__(self,content): # 构造方法
self.__content = content # 属性赋值
def __str__(self): # 特殊方法
return "【__str__()】%s" % self.__content # 返回对象信息
__repr__ = __str__ # 方法引用定义 |
范例:通过Lambda简化方法定义
class Message: # 自定义类
def __init__(self,content): # 构造方法
self.__content = content # 属性赋值
def __repr__(self) -> str: # 特殊方法
return "【__str__()】%s" % self.__content # 返回对象信息 |
对象比较
范例:实现对象的小于判断
# coding : utf-8
class Member(object): # 默认object子类
def __init__(self,name,age): # 构造方法初始化属性内容
self.__name = name # 实例属性赋值
self.__age = age # 实例属性赋值
def __le__(self, other): # 覆写特殊方法
if not isinstance(other,Member) or other == None: # 判断对象是否合法
return False # 返回False,表示判断失败
return self.__age <= other.__age # 摘选属性判断
def main(): # 主函数
mem_a = Member("张三", 18) # 实例化Member类对象
mem_b = Member("李四", 20) # 实例化Member类对象
print(mem_a <= mem_b) # 大小比较,调用“__le__()”
if __name__ == "__main__": # 判断程序执行名称
main() # 调用主函数 |
范例:列表中删除自定义类对象
# coding : utf-8
class Member(object): # object子类
def __init__(self,name,age): # 构造方法
self.__name = name # 实例属性赋值
self.__age = age # 实例属性赋值
def __str__(self): # 覆写特殊方法
return "姓名:%s、年龄:%d" % (self.__name, self.__age)
def __eq__(self, other): # 覆写特殊方法
if not isinstance(other,Member) or other == None: # 判断对象是否合法
return False # 判断失败
return self.__age == other.__age and self.__name == other.__name
def main(): # 主函数
member_list = [Member("张三", 18), Member("李四", 20)] # 定义人员信息列表
# 删除数据时传入匿名对象,列表会调用类中“__eq__()”方法
member_list.remove(Member("张三", 18)) # 删除数据
for mem in member_list: # 列表迭代
print(mem) # 输出列表项
if __name__ == "__main__": # 判断执行名称
main() # 调用主函数 |
范例:覆写“__bool__()”方法实现对象直接判断
# coding : utf-8
class Member(object): # object子类
def __init__(self,name,age): # 构造方法
self.__name = name # 实例属性赋值
self.__age = age # 实例属性赋值
def __bool__(self): # 覆写特殊方法
return self.__age > 18 # 判断是否成年
def main(): # 主函数
mem = Member("李四", 20) # 实例化Member对象
if mem: # 直接调用“__bool__()”方法返回结果
print("成年了!") # 提示信息
if __name__ == "__main__": # 判断程序执行名称
main() # 调用主函数 |
对象格式化
范例:数据格式化
# coding : utf-8
class Message: # object子类
def __init__(self, title, url): # 构造方法接收初始化参数
self.__title = title # 为属性赋值
self.__url = url # 为属性赋值
def __format__(self, format_spec): # 格式化字符串
if format_spec == "": # 是否存在有格式化标记
return str(self) # 不存在标记直接对象的字符串描述
# 按照既定的标记“%title”与“%url”进行内容的字符串替换处理
format_data = format_spec.replace("%title", self.__title).replace("%url", self.__url)
return format_data # 返回格式化后的字符串
def __str__(self): # 获取对象信息
return "名称:%s、网址:%s" % (self.__title, self.__url) # 返回对象内容 def main(): # 主函数
msg = Message("优拓软件学院","www.yootk.com") # 实例化对象
print("{}".format(msg)) # 未指定格式化字符串,返回对象的字符串表示
print("{info:%title:%url}".format(info=msg)) # 定义格式化标记
print(format(msg, "%title:%url")) # 通过format()函数格式化
if __name__ == "__main__": # 判断程序执行名称
main() # 调用主函数 |
范例:序列格式化
# coding : utf-8 |
可调用对象
范例:定义可调用对象
# coding : UTF-8 |
动态导入
范例:定义“util.py”程序模块
# coding : UTF-8 |
范例:实现动态导入操作
# coding : UTF-8 |
属性操作支持
调用拦截
范例:观察调用拦截
# coding : utf-8 |
范例:进行属性和方法分别拦截处理
# coding : utf-8
class Message: # 默认object子类
def __getattribute__(self, item): # 覆写object类方法
if item == "content": # 判断内容为content时的操作
return "沐言优拓:www.yootk.com" # 返回提示信息
elif item == "send": # 判断名称
return self.other # 更换为其它方法
else: # 其它操作不进行处理
return object.__getattribute__(self, item) # 代码正常执行调用
def send(self, info): # 定义类中的方法
print("消息发送:%s" % info) # 输出提示信息
def other(self,note): # 定义一个替代方法
print("【替换方法-other】%s" % note) # 替代操作执行
def main(): # 输出提示信息
msg = Message() # 实例化类对象
# 此时并没有为msg实例化对象动态配置实例属性,按照传统操作此时应该会出现“AttributeError”
print(msg.content) # 获取属性触发“__getattribute__()”
msg.send("www.jixianit.com") # 调用方法触发“__getattribute__()”
if __name__ == "__main__": # 判断程序执行名称
main() # 调用主函数 |
10.2.2、实例属性字典
范例:观察“__dict__”字典存储
# coding : utf-8 |
范例:进行属性设置和获取监听
# coding : utf-8
class Message: # 默认object子类
def __init__(self, content): # 构造方法定义属性
self.__content = content # 保存属性内容
def remove_content(self): # 删除属性
del self.__content # 使用“del”关键字删除
def get_content(self): # 获取属性内容
return self.__content # 返回属性内容
def __setattr__(self, key, value): # 属性设置时拦截
print("【setattr】key = %s、value = %s" % (key, value)) # 输出提示信息
self.__dict__[key] = value # 向“__dict__”中保存属性和数据
def __getattr__(self, item): # 属性不存在时调用
print("【getattr】item = %s" % item) # 提示信息
return "%s属性不存在,返回Nothing" % item # 属性不存在时的返回值
def __delattr__(self, item): # 属性删除
print("【delattr】item = %s" % item) # 输出提示信息
self.__dict__.pop(item) # 从字典中弹出数据
def main(): # 主函数
msg = Message("www.yootk.com") # 实例化类对象
print("【获取存在的属性】%s" % msg.get_content()) # 获取存在的属性内容
print("【获取不存在的属性】%s" % msg.note) # 获取不存在的属性内容
msg.remove_content() # 删除属性
if __name__ == "__main__": # 判断程序执行名称
main() # 调用主函数 |
2.3、获取子类实例化信息
范例:使用“__init_subclass__()”方法
# coding : utf-8
class Parent(object): # 定义父类
def __init__(self): # 父类无参构造,此方法不会执行
print("【Parent】__init__()") # 创建目的:方便读者观察
def __init_subclass__(cls, **kwargs): # 覆写特殊方法
print("【Parent-subclass】cls = %s" % (cls)) # 获取子类信息
print("【Parent-subclass】kwars = %s" % (kwargs)) # 获取子类信息 # 定义子类,同时设置子类操作相关的元数据(使用字典的形式进行定义)
class Sub(Parent, url="www.yootk.com", teacher="李兴华"): # 定义子类 def __init__(self): # 子类构造,不调用父类构造
print("【Sub】__init__()") # 输出提示信息
def main(): # 主函数
sub = Sub() # 实例化子类对象
if __name__ == "__main__": # 判断程序执行名称
main() # 调用主函数 |
3、序列操作支持
3.1、自定义迭代
范例:自定义迭代对象
# coding : utf-8
class Message: # 默认继承object类
def __init__(self, max): # 构造方法
self.__max = max # 设置生成数据的最大值
self.__foot = 0 # 操作脚标
def __iter__(self): # 返回迭代对象
return self # 当前对象为可迭代对象
def __next__(self): # 获取内容
if (self.__foot >= self.__max): # 结束判断
return -1 # 结束标记
else: # 还有数据
val = self.__max - self.__foot # 获取当前迭代数据
self.__foot += 1 # 修改脚标
return val # 返回数据
def main(): # 主函数
msg = Message(10) # 实例化类对象
for v in msg: # 对象可以直接进行迭代
if (v == -1): # 定义结束标记
break # 退出循环
print(v, end="、") # 输出数据
if __name__ == "__main__": # 判断程序执行名称
main() # 调用主函数 |
范例:修改Message类中的“__next__()”方法定义
class Message: # 自定义类
# 其他重复代码略…
def __next__(self): # 获取内容
if (self.__foot >= self.__max): # 结束判断
raise StopIteration() # 结束迭代调用
else: # 还有数据
val = self.__max - self.__foot # 获取当前数据
self.__foot += 1 # 修改脚标
return val # 返回数据 |
范例:for循环调用可迭代对象
def main(): # 主函数
msg = Message(10) # 实例化类对象
for v in msg: # 对象直接迭代
print(v, end="、") # 输出数据 |
3.2、对象反转
范例:自定义反转操作
# coding : utf-8
class Message: # 自定义Message类
def __init__(self): # 构造方法
self.__msg_list = ["沐言优拓","www.yootk.com"] # 初始化列表
def get_msg_list(self): # 获取属性
return self.__msg_list # 返回列表属性
def __reversed__(self): # 对象反转支持
self.__msg_list = reversed(self.__msg_list) # 反转处理
def main(): # 主函数
msg = Message() # 实例化类对象
reversed(msg) # 序列反转
for item in msg.get_msg_list(): # 迭代输出
print(item, end="、") # 输出列表项
if __name__ == "__main__": # 判断程序执行名称
main() # 调用主函数 |
3.3、字典操作支持
范例:字典操作监听
# coding : utf-8
class Message: # 默认object子类
def __init__(self): # 构造方法
self.__map = {} # 定义一个空的字典
def __setitem__(self, key, value): # 设置字典数据时触发
print("【setitem】设置数据,key = %s、value = %s" % (key,value))
self.__map[key] = value # 向字典保存数据
def __getitem__(self, item): # 获取字典数据时触发
print("【getitem】获取数据,item = %s" % item) # 输出提示信息
return self.__map.get(item) # 从字典获取数据
def __delitem__(self, key): # “del”删除数据时触发
print("【delitem】删除数据,key = %s" % key) # 输出提示信息
self.__map.pop(key) # 从字典中弹出数据
def __len__(self): # 获取对象长度
return len(self.__map) # 返回字典长度
def main(): # 主函数
msg = Message() # 实例化类对象,并可以按照字典模式操作
msg["yootk"] = "www.yootk.com" # 设置字典数据
print("数据保存个数:%s" % len(msg)) # 获取数据长度
print(msg["yootk"]) # 获取字典数据
del msg["yootk"] # 删除字典数据
if __name__ == "__main__": # 判断程序执行名称
main() # 调用主函数 |