python中的特殊方法使用

__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
class Message:
   
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) # 返回对象信息
class MessageListFormat:                                                                    # 定义格式化类
    def __init__(self,*msgs):                                                           # 构造方法
        self.msg_list = list(msgs)                                                  # 保存集合列表
   
def __format__(self, format_spec):                                          # 覆写特殊方法
        if format_spec == "":                                                           # 是否存在有格式化标记
           
return str(self)                                                             # 不存在标记直接对象的字符串描述
       
format_data = "\n".join("{:{fs}}".format(m, fs=format_spec) for m in self.msg_list)
       
return format_data                                                                 # 返回格式化数据
def main():                                                                                             # 主函数
    message_list = MessageListFormat(Message("沐言优拓", "www.yootk.com") # 实例化对象
    Message("优拓讲师", "李兴华"))                                           # 保存多个对象
   
print("{info:%title:%url}".format(info=message_list))    # 定义格式化标记
if __name__ == "__main__":                                                                     # 判断程序执行名称
    main()                                                                                                 # 调用主函数

可调用对象

范例:定义可调用对象

# coding : UTF-8
class Message:                                                                                       # object子类
    def __call__(self, *args, **kwargs):                                       # 定义对象调用支持
       
return "title = %s、url = %s" % (kwargs.get("title"), kwargs.get("url")) # 返回数据
def main():                                                                                             # 主函数
    msg = Message()                                                                              # 实例化类对象
   
print(msg())                                                                                    # 对象直接调用并且不传递参数
   
print(msg(title="沐言优拓",url="www.yootk.com"))                # 对象调用并传递参数
   
print(callable(msg))                                                                     # 判断当前对象是否可调用
if __name__ == "__main__":                                                                     # 判断程序执行名称
    main()                                                                                                 # 调用主函数

动态导入

范例:定义“util.py”程序模块

# coding : UTF-8
def get_info():                                                                                      # 定义函数
    return "沐言优拓:www.yootk.com"                                              # 返回信息
class Message:                                                                                       # 自定义Message类
    def echo(self, info):                                                                   # 定义方法
        return "【ECHO】" + info                                                      # 返回信息

范例:实现动态导入操作

# coding : UTF-8
def main():                                                                                             # 主函数
    util = __import__('util')                                                           # 导入util.py模块
   
get_info_obj = getattr(util, "get_info")                               # 获取模块中的函数引用
   
print(get_info_obj())                                                                   # 通过引用对象直接调用函数
   
message_class = getattr(util, "Message")                               # 获取模块中的类引用
   
print(message_class().echo("www.yootk.com"))                        # 实例化类对象并调用类中方法
if __name__ == "__main__":                                                                     # 判断程序执行名称
    main()                                                                                                 # 调用主函数

属性操作支持

调用拦截

范例:观察调用拦截

# coding : utf-8
class Message:                                                                                       # 默认object子类
   
def __getattribute__(self, item):                                            # 覆写object类方法
       
print("【getattribute】item = %s" % (item))                 # 监听信息提示
       
return object.__getattribute__(self, item)                    # 如果不调用此处则代码无法正确执行
   
def send(self, info):                                                                  # 定义类中的方法
       
print("消息发送:%s" % info)                                              # 输出提示信息
def main():                                                                                             # 主函数
    msg = Message()                                                                              # 实例化类对象
   
msg.content = "沐言优拓:www.yootk.com"                               # 动态配置实例属性
   
print(msg.content)                                                                        # 获取属性触发“__getattribute__()”
   
msg.send("www.jixianit.com"                                                  # 调用方法触发“__getattribute__()”
if __name__ == "__main__":                                                                     # 判断程序执行名称
    main()                                                                                                 # 调用主函数

范例:进行属性和方法分别拦截处理

# 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
class Message:                                                                                       # 默认object子类
   
def __init__(self,note):                                                             # 构造方法设置属性
       
self.__note = note                                                                 # 操作实例属性
def main():                                                                                             # 主函数
    msg = Message("沐言优拓"                                                        # 实例化类对象
   
msg.content = "www.yootk.com"                                                   # 配置实例属性
   
print(msg.__dict__)                                                                      # 获取属性保存字典信息
if __name__ == "__main__":                                                                     # 判断程序执行名称
    main()                                                                                                 # 调用主函数

范例:进行属性设置和获取监听

# 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()                                                # 调用主函数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值