鱼C论坛

 找回密码
 立即注册
查看: 2659|回复: 1

[已解决]Python魔法方法的理解。

[复制链接]
发表于 2020-3-1 00:05:16 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x

定义一个类,将小写全部变为大写

方法1:
class A(str):
    def __new__(cls, string):
        string = string.upper()
        return str.__new__(cls, string)

方法2:
class A(str):
    def __new__(cls, string):
        string = string.upper()
        return string

方法3:
class A(s):
    def __new__(cls, string):
        string = string.upper()
        return string


这3个方法都能实现,请问区别在哪里?
最佳答案
2020-3-1 00:44:18
本帖最后由 jackz007 于 2020-3-1 11:46 编辑

       魔术方法 __new()__ 是在定义对象的时候,把用于初始化对象的属性赋予对象,而不是单纯返回一个字符串,所以,只有方法 1 才是正确的。
       A() 继承自 str 类,所有 str 类的方法在 A() 中都可以直接使用,之所以要重新定义这个新类,唯一目的,就是希望实现在定义一个新对象的时候,能够自动把字符串中所有的小写字母转换成大写字母,除此以外,A() 作为类的各种特性与 str 完全相同。
       对于用户而言,str 类的结构系统并不透明,str . __new__() 是 str 类的一个重要方法,这个方法在新对象创建过程中所扮演的角色和所起到的作用细节我们无从知道,在这种情况下,用我们自己编写的代码完全取而代之的做法显然是盲目的和错误的。在创建 str 类对象的时候,str . __new__() 方法会被自动调用, 同理,在创建 A() 新对象的时候,A() . __new__() 方法也会被自动调用,如果这个方法不存在,就会调用父类的同名方法,也就是 str . __new()__。新建 A() 的对象的时候,由我们编写的函数 A() . __new__() 会首先获得控制,使我们能有机会对用于初始化对象的属性进行必要的加工,然后,再以新的属性作为输入参数,调用父类 str . __new()__ 方法作为结束。这样,既达到了我们的目的(字符串小写字母变成大写),同时,也不会妨碍 str . __new__() 在创建对象过程发挥各种关键作用。所以,不仅在编写 __new()__ 的时候需要如此,凡是需要重写魔术方法的时候,都必须遵循这个模式。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-3-1 00:44:18 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2020-3-1 11:46 编辑

       魔术方法 __new()__ 是在定义对象的时候,把用于初始化对象的属性赋予对象,而不是单纯返回一个字符串,所以,只有方法 1 才是正确的。
       A() 继承自 str 类,所有 str 类的方法在 A() 中都可以直接使用,之所以要重新定义这个新类,唯一目的,就是希望实现在定义一个新对象的时候,能够自动把字符串中所有的小写字母转换成大写字母,除此以外,A() 作为类的各种特性与 str 完全相同。
       对于用户而言,str 类的结构系统并不透明,str . __new__() 是 str 类的一个重要方法,这个方法在新对象创建过程中所扮演的角色和所起到的作用细节我们无从知道,在这种情况下,用我们自己编写的代码完全取而代之的做法显然是盲目的和错误的。在创建 str 类对象的时候,str . __new__() 方法会被自动调用, 同理,在创建 A() 新对象的时候,A() . __new__() 方法也会被自动调用,如果这个方法不存在,就会调用父类的同名方法,也就是 str . __new()__。新建 A() 的对象的时候,由我们编写的函数 A() . __new__() 会首先获得控制,使我们能有机会对用于初始化对象的属性进行必要的加工,然后,再以新的属性作为输入参数,调用父类 str . __new()__ 方法作为结束。这样,既达到了我们的目的(字符串小写字母变成大写),同时,也不会妨碍 str . __new__() 在创建对象过程发挥各种关键作用。所以,不仅在编写 __new()__ 的时候需要如此,凡是需要重写魔术方法的时候,都必须遵循这个模式。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-3-1 16:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表