python进阶--魔法方法之类的表示

这篇具有很好参考价值的文章主要介绍了python进阶--魔法方法之类的表示。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

下面的魔法方法都可以用了描述类

1、__str__

该方法一般返回字符串,也许不会返回一个有效的 Python 表达式,但可以使用更方便或更准确的描述信息。在类中重写该方法,用来输出类的属性值等信息

调用:str(object)或者内置函数format()或者print()都会调用__str__()方法

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def describe(self):
        print('名字:'+self.name + ',年龄:' + str(self.age))

    #重写_str__函数
    def __str__(self):
        return 'str:'+'名字:'+self.name + ',年龄:' + str(self.age)


if __name__ == '__main__':
    p = Person('Joy', 25)
    print(p)
    #print(str(p))

    p.describe()

输出:
str:名字:Joy,年龄:25
名字:Joy,年龄:25
2、__repr__

用来输出一个对象的“官方”字符串表示。返回值必须是字符串对象此方法通常被用于调试。内置类型 object 所定义的默认实现会调用 object.__repr__()
调用:通过repr()调用

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def describe(self):
        print('名字:'+self.name + ',年龄:' + str(self.age))

    #重写_str__函数
    def __str__(self):
        return 'str:'+'名字:'+self.name + ',年龄:' + str(self.age)

        # 重写_str__函数
    def __repr__(self):
        return 'repr:'+'名字:' + self.name + ',年龄:' + str(self.age)


if __name__ == '__main__':
    p = Person('Joy', 25)
    print(str(p))
    print(repr(p))

    p.describe()

输出:
str:名字:Joy,年龄:25
repr:名字:Joy,年龄:25
名字:Joy,年龄:25

__str__和__repr__都是用来输出一个对象,但是也有一些区别,描述如下

  • __str__ 的目标是可读的,__str__()并不预期返回一个有效的 Python 表达式,但可以使用更方便或更准确的描述信息。
  • __repr__ 的目标是明确的,所返回的字符串应该准确、无歧义,并且尽可能表达出如何 用代码创建出这个被打印的对象。
  • 容器的 str 方法的使用包含对象的 repr
3、__unicode__()

定义对类的实例调用 unicode() 时的行为,返回unicode字符串,在对象上调用unicode()时就会调用__ unicode__()方法。一般项目中使用Django时,我们通常会在mode类中重写__ unicode__()方法,因为Django的数据库后端会返回Unicode字符串给model属性。

如果调用 str() ,但类只实现了 __unicode__() ,那么将会报错,需要实现__ str__()。,但是在Django项目中可以只定义了__ unicode__()方法,不定义__ str__()方法,因为Django会自动提供一个调用 __ unicode__()方法的__ str__()方法,用于把结果转换为UTF-8编码的字符串对象,所以在一般情况下,只定义__ unicode__()方法,让 Django来处理字符串对象的转换

Python3x中使用__ str__()方法替代__unicode__()方法

#运行环境为python2x
class Person():
    def __init__(self, name):
        self.name = name

    def __unicode__(self):
        return "name:"+self.name


obj = Person("Hello, Unicode!")
print(unicode(obj))  

输出:name:Hello, Unicode!
4、__format__()

定义当类的实例用于新式字符串格式化时的行为,调用format() 会导致调用 __format__() 。在定义自己的数值类型或字符串类型时,并且需要提供某些特殊的格式化选项,使用 __format__()方法可以很容易实现

class point:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __str__(self):
        return 'x: %s, y: %s' % (self.x, self.y)

    def __format__(self, code):
        print "__format__"
        return 'x: {x}, y: {y}'.format(x=self.x, y=self.y)

p = point(3, 4)
print ('point is {}'.format(p))

输出:
__format__
point is x: 3, y: 4

分析:由于format当中支持通过参数来对处理逻辑进行配置的功能,所以在__format__()多加了一个参数code,我们就可以直接调用format(p)

在有些场景中我们需要提供多种输出,比如下面例子

formats = {
    'normal': 'x: {p.x}, y: {p.y}',
    'point': '({p.x}, {p.y})',
    'prot': '<{p.x}, {p.y}>'
}

class point:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __str__(self):
        return 'x: %s, y: %s' % (self.x, self.y)

    def __format__(self, code):
        return formats[code].format(p=self)


p = point(3, 4)
print (p.__format__('normal'))
print (p.__format__('point'))

输出:
x: 3, y: 4
(3, 4)
5、__nonzero__()

__nonzero__()定义了类的实例调用 bool() 时的行为,在设计自己的类时,使用该方法针对不同的实例返回True或False

在Python 3.x中,__nonzero__方法被__bool__方法替代

__bool__()__nonzero__()类似,定义了类的实例调用 bool() 时的行为,调用此方法来实现真值检测以及内置的 bool() 操作;应该返回 False 或 True, 当未定义此方法时,则在定义了 __len__() 的情况下将调用它,如果其结果不为零则该对象将被视为具有真值。

如果一个类的 __len__()__bool__() 均未定义,则其所有实例都将被视为具有真值。

>>> class test:
>>>     def __bool__(self):
>>>         return False

>>> bool(test())
False
>>> not test()
True
6、__hash__()和__dir__()方法

__hash__(self)__dir__(self)方法,在定义类的时候很少用到,我们这里就不展开描述了,了解其作用即可
(1)__hash__(self)
必须返回整数,其结果会被用于字典中键的快速比较;作用是定义对类的实例调用 hash() 时的行为。同时注意一点,实现这个魔法方法通常也需要实现 __eq__ ,并且遵守如下的规则: a == b 意味着 hash(a) == hash(b)。

(2)__dir__(self)
这个方法应该向调用者返回一个属性列表;作用是定义对类的实例调用 dir() 时的行为。一般来说,没必要自己实现 __dir__ 。但是如果你重定义了 __getattr__ 或者 __getattribute__ ,乃至使用动态生成的属性,以实现类的交互式使用,那么这个魔法方法是必不可少的。文章来源地址https://www.toymoban.com/news/detail-679640.html

到了这里,关于python进阶--魔法方法之类的表示的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • python的几种时间表示方法

    一、时间的几种表示方法 time时间模块儿获取当天的时间 1、详细表示当前的时间 import time time.localtime() 2、标准输出当前时间格式 import time time.strftime(\\\"%Y-%m-%d %H:%M:%S\\\",time.localtime()) datetime时间模块儿获取当天的时间 1、详细表示当前时间 import datetime time = datetime.datetime.now() pr

    2023年04月21日
    浏览(27)
  • 【python】16.Python语言进阶

    重要知识点 生成式(推导式)的用法 说明:生成式(推导式)可以用来生成列表、集合和字典。 嵌套的列表的坑 Python Tutor - VISUALIZE CODE AND GET LIVE HELP heapq 模块(堆排序) itertools 模块 collections 模块 常用的工具类: namedtuple :命令元组,它是一个类工厂,接受类型的名称和

    2024年01月17日
    浏览(31)
  • Spring事务失效场景之类内部方法调用及解决方案

    在日常开发中,经常有需要使用事务来保证数据一致性的情况。简单点的话直接在方法上面加@Transactional注解就可以了。 但这样存在一个问题,在整个业务方法层面加注解会把很多并不需要归入事务的操作也归入到了事务里面,这样会可能会出现大事务的情况,影响系统性能

    2024年01月17日
    浏览(39)
  • Spring Boot进阶(62):Redis魔法:用发布订阅功能打造高效消息队列!

            话说,玩过MQ的同学可能都知道【发布订阅】模式,不就是一种消息传递方式嘛;如果没玩过,那也不打紧,下文我会简单做个科普。但是对于Redis如何实现MQ的【发布订阅】功能?这才是问题的关键,有的同学就说“压根没玩过呀!不造” ,哈哈,bug菌既然敢写便有

    2024年02月09日
    浏览(35)
  • Python系统学习1-9-类一之类语法

    一、类之初印象 1、类就是空表格,将变量(列名)和函数(行为)结合起来 2、创建对象,表达具体行 3、创建类就是创建数据的模板         --操作数据时有提示         --还能再组合数据的行为         --结构更加清晰 4、类的内存分配  5、练习  二、类语法 (1)类定

    2024年02月12日
    浏览(45)
  • 【python全栈开发】面向对象进阶

    实例变量:属于对象,每个对象中各自维护自己的数据。 类变量:属于类,可以被所有对象共享,一般用于给对象提供公共数据(类似于全局变量)。 类变量和实例变量的区别示例: 类变量和实例变量+继承问题: 通常来说,调用的变量不是对象变量时,就会去对应的类中

    2024年02月21日
    浏览(75)
  • C语言中到底是非0表示真,还是1表示真?

    我是荔园微风,作为一名在IT界整整25年的老兵,今天我们来重点说一说C语言中到底是非0表示真,还是1表示真?这就是说到C语言中的两个常见运算形式,即关系运算符和逻辑运算符。 为照顾急性子的同学,先直接说结论: 关系运算符和逻辑运算符用“真”和“假”表示运算

    2024年02月04日
    浏览(49)
  • 探索C语言的内存魔法:动态内存管理解析

    ✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:C语言学习 贝蒂的主页:Betty‘s blog 通过前面的学习,我们已经掌握了两种开辟内存的方法,分别是: 但是静态开辟的空间明显有两个缺陷: 空间开辟⼤⼩是 固定 的。 数组在申明的时候,

    2024年02月19日
    浏览(34)
  • 🔥🔥Java开发者的Python快速进修指南:函数进阶

    在上一篇文章中,我们讲解了函数最基础常见的用法,今天我想在这里简单地谈一下函数的其他用法。尽管这些用法可能不是非常常见,但我认为它们仍然值得介绍。因此,我将单独为它们开设一个章节,并探讨匿名函数和装饰器函数这两种特殊的用法。 在Python中,匿名函数

    2024年02月05日
    浏览(39)
  • 【Python】进阶学习:一文掌握resize方法,轻松调整图像大小

    【Python】进阶学习:一文带你使用resize方法调整image对象的图像大小 🌈 个人主页:高斯小哥 🔥 高质量专栏:Matplotlib之旅:零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程👈 希望得到您的订阅和支持~ 💡 创作高质量博文(平均质量分92+),分享更多

    2024年04月25日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包