鱼C论坛

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

[已解决]代码显示什么内容

[复制链接]
发表于 2020-7-1 10:49:50 | 显示全部楼层 |阅读模式

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

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

x
1.
class A:
    def __init__(self):
        pass
    def get(self):
        print(__name__)
 
>>> a = A()
>>> a.get()

2.
class A:
    def __init__(self, a, b, c):
        self.x = a + b + c

a = A(1,2,3)
b = getattr(a, 'x')
setattr(a, 'x', b+1)
print a.x

以上代码分别会显示什么内容为什么?看不懂
最佳答案
2020-7-1 12:00:03
本帖最后由 Twilight6 于 2020-7-1 13:15 编辑





第一个代码:打印显示的是 __main__

__name__ 是类中的属性,当在脚本中直接运行,返回的是__main__ 而当被当作模块导入时候返回的是 模块自己的名字

这个代码的意思是当模块被直接运行时, if __name__ == '__main__'  下代码块将被运行,当模块是被导入时, if __name__ == '__main__'  下面的代码块不被运行。


第二个代码: 打印显示的是 7 (你这里的 print 忘记带括号了,除非你是2.x版本的Python)

getattr函数用来获取对象中的属性,第一个参数是被获取的对象,第二个参数就是获取的属性名
class A:
    def __init__(self, a, b, c):
        self.x = a + b + c

a = A(1,2,3)
b = getattr(a, 'x')

则 getattr(a, 'x') 这里 a 对象中的 x 属性 是等于 6 的 所以 b = 6
setattr(a, 'x', b+1)
setattr() 函数 第一个参数也是填入对象,第二个是需要设置的属性名,第三个就是设置的属性值了

那么这里就是将 a 实例对象中的 x 重新赋值为  b + 1  ,而 因为之前的  b = 6 所以这里重新赋值 x 的值 所以打印结果为 7




想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-7-1 11:53:55 | 显示全部楼层
(1)
Help on module __main__:

NAME
    __main__

DATA
    __annotations__ = {}

FILE
    (built-in)
(2)
__init__是构造函数, a=A(1,2,3)表示a.x=6了 之后的b=getattr(a,'x'),b=6  setattr(a,'x',b+1) 使得a.x=6+1=7
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-1 12:00:03 | 显示全部楼层    本楼为最佳答案   
本帖最后由 Twilight6 于 2020-7-1 13:15 编辑





第一个代码:打印显示的是 __main__

__name__ 是类中的属性,当在脚本中直接运行,返回的是__main__ 而当被当作模块导入时候返回的是 模块自己的名字

这个代码的意思是当模块被直接运行时, if __name__ == '__main__'  下代码块将被运行,当模块是被导入时, if __name__ == '__main__'  下面的代码块不被运行。


第二个代码: 打印显示的是 7 (你这里的 print 忘记带括号了,除非你是2.x版本的Python)

getattr函数用来获取对象中的属性,第一个参数是被获取的对象,第二个参数就是获取的属性名
class A:
    def __init__(self, a, b, c):
        self.x = a + b + c

a = A(1,2,3)
b = getattr(a, 'x')

则 getattr(a, 'x') 这里 a 对象中的 x 属性 是等于 6 的 所以 b = 6
setattr(a, 'x', b+1)
setattr() 函数 第一个参数也是填入对象,第二个是需要设置的属性名,第三个就是设置的属性值了

那么这里就是将 a 实例对象中的 x 重新赋值为  b + 1  ,而 因为之前的  b = 6 所以这里重新赋值 x 的值 所以打印结果为 7




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

使用道具 举报

 楼主| 发表于 2020-7-1 13:08:17 | 显示全部楼层
Twilight6 发表于 2020-7-1 12:00
第一个代码:打印显示的是 __main__

__name__ 是类中的属性,当在脚本中直接运行,返回的是__ma ...

而当被当作模块导入时候返回的是 模块自己的名字,这个将可以用来你不想导入模块时候的方法到 if __name__ == '__main__' 中去,就不会被导入
这句话没有理解可以举个例子吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-1 13:15:12 | 显示全部楼层
波大大12138 发表于 2020-7-1 13:08
而当被当作模块导入时候返回的是 模块自己的名字,这个将可以用来你不想导入模块时候的方法到 if __name_ ...


我上面的描述有误,抱歉,不是不被导入是 :

当模块被直接运行时, if __name__ == '__main__'  下代码块将被运行,当模块是被导入时,代码块不被运行。
#a.py
def fun():
    pass

def t():
    pass

fun()
if __name__ == '__main__' :
    t()
# b.py
import a

b.py 运行结果:
func # 发现并没用打印 t

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-20 03:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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