鱼C论坛

 找回密码
 立即注册
查看: 2398|回复: 4

类,类对象,对象实例化这个单元让我很懵逼

[复制链接]
回帖奖励 6 鱼币 回复本帖可获得 3 鱼币奖励! 每人限 1 次(中奖概率 70%)
发表于 2019-9-5 21:32:47 | 显示全部楼层 |阅读模式

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

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

x
最近上到了小甲鱼讲的类,类对象,类的实例化,还有魔法方法这一章,说实话整的有点懵逼!
下面这是小甲鱼让求的,输入数字按照int()处理,输入字符串则返回ASCII码之和处理
代码1
class NINT(int):

    def __new__(self,num):
        
        n=num
        if isinstance(n,str):
            n=0
            for i in range(len(num)):               
                n+=ord(num[i])
                       
        else: n=int(n)

        return n

代码2
class NINT(int):

    def __new__(self,num):
        
        self.n=num
        if isinstance(num,str):
            self.n=0
            for i in range(len(num)):               
                self.n+=ord(num[i])
                       
        else: self.n=int(self.n)

        return self.n

问题1:为什么上面不用写成self.n 程序也能用,下面的我是按照self.n来写的。???之前一直强调要用self才行的
哪位同学能不能讲一下,最好能打个比喻讲解一下,因为我对几个关于类的专业术语都是有点懵的状态

问题2:小甲鱼回答了关于 __new__ 方法是负责什么任务,(答:__new__ 方法主要任务时返回一个实例对象,通常是参数 cls 这个类的实例化对象,当然你也可以返回其他对象)
这个答案看着我也没明白,只知道现在怎么去用,能不能稍微通俗地解释一下,谢谢~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-9-5 23:47:07 | 显示全部楼层

回帖奖励 +3 鱼币

当你需要实例化对象的时候会先调用__new__,创建并返回实例,具体还是百度吧,说的肯定比我好。
上述程序你实例化的时候调用__new__返回的是一个整型数字,实例化后的对象类型为INT不是NINT了,所以无法调用NINT里的数据(所以n和self.n没什么区别了)
class NINT(int):
    def __new__(self,num):
        n=num
        if isinstance(n,str):
            n=0
            for i in range(len(num)):               
                n+=ord(num[i])         
        else: n=int(n)
        return int.__new__(self,num)
c = NINT(3)
print(c)
print(type(c))
print(c.n)


#输出
3
<class '__main__.NINT'>
Traceback (most recent call last):
  File "C:\Users\Jin\Desktop\新建文本文档.py", line 14, in <module>
    print(c,c.n)
AttributeError: 'NINT' object has no attribute 'n'
修改__new__后,返回了NINT类对象,想要调用n,要直接使用c,比如 print(c+3),输出为6,无法直接调用c.n
class NINT(int):
    def __new__(self,num):
        self.n=num
        if isinstance(num,str):
            self.n=0
            for i in range(len(num)):               
                self.n+=ord(num[i])
                       
        else: self.n=int(self.n)
        return int.__new__(self,num)
c = NINT(3)
print(c)
print(type(c))
print(c.n)
#输出
3
<class '__main__.NINT'>
3
写入self后,能通c.n来调用n
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-6 11:01:32 | 显示全部楼层
jinlovelive 发表于 2019-9-5 23:47
当你需要实例化对象的时候会先调用__new__,创建并返回实例,具体还是百度吧,说的肯定比我好。
上述程序你 ...

好像,有点懵懵懂懂地懂了!!!~~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-23 10:11:29 | 显示全部楼层

回帖奖励 +3 鱼币

学习学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-17 11:59:30 | 显示全部楼层

回帖奖励 +3 鱼币

不太了解
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-17 21:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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