V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
zhoudaiyu
V2EX  ›  Python

问一个 Python 小白问题

  •  
  •   zhoudaiyu · 2019-09-18 17:15:03 +08:00 · 3010 次点击
    这是一个创建于 1925 天前的主题,其中的信息可能已经有所发展或是发生改变。

    程序是这样的:

    def a(): print("a")

    class b(object): print("b")

    if name == 'main': b()

    运行结果是:b

    想问的问题是:( 1 )为什么 a 方法没有被执行 ( 2 )为什么 b 类没有实例化却执行了里面的 print ( 3 )为啥在 main 方法中实例化了对象,但没有执行 print 方法

    去 google 查了但是好像没啥解释的(也许搜的问题不对?)。求大佬解答!

    23 条回复    2019-09-19 13:55:35 +08:00
    ranleng
        1
    ranleng  
       2019-09-18 17:17:09 +08:00 via Android
    先把排版搞好吧
    Crossin
        2
    Crossin  
       2019-09-18 17:19:51 +08:00   ❤️ 1
    1.没调用
    2.main 里实例化了
    3.执行了
    Yourshell
        3
    Yourshell  
       2019-09-18 17:21:13 +08:00
    楼上能看懂的也是人才
    BingoXuan
        4
    BingoXuan  
       2019-09-18 17:22:17 +08:00
    1.函数 a 没有调用
    2.b 类在定义时候你将定义类需要的执行的函数定义变成了 print,所以定义时候就执行了 print,而不是实例化时候执行 print
    3.是__name__ == '__main__',python 所有 magic 的东西都是双下划线开头双下划线结束

    教程还是用廖雪峰的教程的吧
    lihongjie0209
        5
    lihongjie0209  
       2019-09-18 17:22:52 +08:00
    1. 函数定义了但是没有被调用
    2. b 被定义了, 并且在 main 中实例化了, 所以 b 类中的代码被执行了
    ipwx
        6
    ipwx  
       2019-09-18 17:23:24 +08:00 via Android
    1. a 被定义了,没有被调用。2. 如果你执行这个文件,b 已经被实例化了。但是 print b 不是因为 b 被实例化,而是因为你在 B 类被定义阶段执行了这句话。实例化的代码要写在类的 __init__ 函数里。3. python 没有 main 函数或者 main 方法,这段只是基本的 if 语句。写在全局的所有语句都会被执行,只不过这段 if 包含的代码只有直接执行这个文件才会被执行。
    libaibuaidufu
        7
    libaibuaidufu  
       2019-09-18 17:25:01 +08:00
    搜不到答案,是因为 在对 python,仅这种理解程度时,别人都还在跟着教程走。不会去搜索为什么。然后到后面就认为是理所当然了。
    cherbim
        8
    cherbim  
       2019-09-18 17:28:59 +08:00
    """
    def a():
    print("a")
    class b(object):
    print("b")
    if __name__ == '__main__':
    b()
    """
    zhoudaiyu
        9
    zhoudaiyu  
    OP
       2019-09-18 17:34:54 +08:00 via iPhone
    @ipwx
    @lihongjie0209
    @BingoXuan
    @Crossin 即便没有在 main()里实例化也可以打印出 b
    niknik
        10
    niknik  
       2019-09-18 17:53:26 +08:00
    不是__name__和 __main__吗?
    whusnoopy
        11
    whusnoopy  
       2019-09-18 17:56:18 +08:00
    楼主其实有双下划线,只不过没有用 Markdown 里的代码区块包住,被转义成加粗了,注意看只有 name 和 main 是加粗的
    cherbim
        12
    cherbim  
       2019-09-18 18:24:06 +08:00
    @zhoudaiyu
    类 b 在你执行文件的时间默认已经实例化, 所以 main()里再对 b()实例化没意义,if __name__ == '__main__':是人造程序入口,执行里面的程序
    Trim21
        13
    Trim21  
       2019-09-18 18:26:16 +08:00 via Android
    其实前两行是合法的 python 代码…233
    zhoudaiyu
        14
    zhoudaiyu  
    OP
       2019-09-18 18:38:26 +08:00 via iPhone
    class A():
    print(‘a’)

    这样 run 也可以打印出 a
    cherbim
        15
    cherbim  
       2019-09-18 18:41:31 +08:00
    '''
    class Test:
    print('test')
    # 这算啥玩意?类有类名,属性,方法,好像没这玩意,按照逐行执行原则,类在定义的时间会自动执行这一句
    # 类对象支持两种操作:属性引用(__init__默认实例化)和 实例化
    def print(self): ## 类被实例化后实例会拥有这个方法
    print("我是测试函数")
    a = Test()
    b = Test()
    c = Test()
    a.print()
    b.print()
    c.print()
    '''
    ps:我觉得你产生疑问的根本原因是你的类不是标准化,类有类名,属性,方法三要素,你这个 print 算啥玩意,l 理论上上述代码执行,先定义类,会自动执行 print ( test ),后面的三次实例化都不会执行 print ( test ),只会让实例 abc 拥有 print 方法,所以输出结果为:
    test
    我是测试函数
    我是测试函数
    我是测试函数
    cherbim
        16
    cherbim  
       2019-09-18 18:43:07 +08:00
    要不换成标准类试试?
    ClericPy
        17
    ClericPy  
       2019-09-18 22:11:10 +08:00
    总结下上面回复们
    1. 说排版的, 除了 __name__ 写错了, 实际没有语法错误
    2. 类 b 其实不用实例化也是会执行 print 那句的, print 函数返回个 None, 它之所以被执行, 是因为类声明的时候类属性那个位置是要执行的, 不会等到实例化才执行, 毕竟很多类属性 /类方法都是无实例化直接在类上调用
    5. a 是函数, 函数和方法用途相似但也略有不同, 函数虽然是个对象, 但是和类不是一回事, 建议好好看点基础, 除了百年廖雪峰那博客, 现在微软官方给了 python 教程, 甚至 python 官方教程也是中文版
    BingoXuan
        18
    BingoXuan  
       2019-09-18 22:35:48 +08:00 via Android
    @zhoudaiyu
    你误解我的意思了,你的 print 是解释器定义 class 的过程时候中执行,而不是实例化。就好像将一个函数的返回值设定为全局变量,如果函数里面有 print,那么就会打印出内容,当返回值变成全局变量时候就类似于你的 class 已经被解释器定义好了。
    guog
        19
    guog  
       2019-09-18 23:19:33 +08:00
    @ClericPy #16 他也没写错,双下划线 markdown 转义了,应该用个代码块整体包起来就好了
    hyserendipity
        20
    hyserendipity  
       2019-09-19 00:10:48 +08:00 via iPhone
    这排版。。。你可能不太适合写 py
    ipwx
        21
    ipwx  
       2019-09-19 00:21:52 +08:00
    @zhoudaiyu 我解释地很清楚了,重复一遍:

    “如果你执行这个文件,b 已经被实例化了。但是 print b 不是因为 b 被实例化,而是因为你在 B 类被定义阶段执行了这句话。实例化的代码要写在类的 __init__ 函数里。”

    第一句话是指出你的问题,“b 没有被实例化却执行了 print("b")”,是错的,因为 b 确实被实例化了。第二句话,指出你的代码,b 不需要被实例化,print("b") 就已经被执行了。
    aaronhua
        22
    aaronhua  
       2019-09-19 10:25:28 +08:00
    终于看懂了这个问题。盲猜,楼主的代码是在交互模式下执行的。然后,才根据顺序提出的三个问题。究其原因,就是类 b 在定义的时候,就执行了 print ( b )。话说,写 python 一年了,才知道这个细节。
    SjwNo1
        23
    SjwNo1  
       2019-09-19 13:55:35 +08:00
    先 markdown 啊 头疼哈哈
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3689 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 00:51 · PVG 08:51 · LAX 16:51 · JFK 19:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.