想询问一下python有没有多行注释

问题描述

才入门python一年,今天突然看到一个讨论注释的问题。然后就想到了python里面的注释。在我学习python的时候,各种专业书籍、官方文档这些,都说#是单行注释,三引号是多行注释。但是在写代码时候,三引号又可以被当成字符串来使用。
但注释是写给人看的,程序在运行时是不会去管注释里面内容的。那我想问问python有没有多行注释

我的观点

没有多行注释

理由1 三引号里面的东西可以赋值给变量,且查看三引号的type是str

img


显然这被python解释了,不符合注释不解释那条

理由2 如果不考虑赋值,那么单引号也可以起到多行注释的效果(代码如下),凭啥这就不是注释了

'new  \
bee \
'

理由3 python注释可以通过help()函数自动生成文档

这就说明python会读取并处理注释内容,其它语言的注释比如c好像没有吧,ps:这c方面我未曾深入了解,勿喷

你大概没学过编译原理
三引号必须放在行首

如果代码中起到注释作用的代码就是注释,那么说三引号是注释这没有什么不妥(单引号需要在结尾加上\,那用起来和#构成的多行注释体现不了便捷性),这也是大多数人的理解。我这么说并没有任何问题。
但是如果你非要说被解释所以不算注释,那你也能自圆其说,也没什么好争论的。(也许你想表达的是被执行,因为作为解释语言,自然一切都要进行解释,包括注释,要是不解释,怎么知道这是注释呢。但是你又怎么知道单独写的内容会被执行?从优化的角度来说,这是一个匿名变量,没有任何变量引用,完全可以被优化掉,你写变量名 = 字符串,和单独写字符串,这根本不是一回事)

就好比通常来说,大家都认为C++是一种编译语言,但是C++的模板元编程是图灵完备的,你也可以把C++的编译器当作一个解释器,把所有的程序都写成编译的过程就执行完毕了,从而你声称全世界都错了,C++是解释语言。这种说法不能说错,但是没有什么现实意义。

我再多说几句。Python语言的一个设计思想就是简洁——如无必要勿增实体。举例来说,有的语言会专门有构造函数的语法,有属性访问器的语法,但是在Python里,使用魔术方法——魔术方法的本质是,对于程序员来说,这是一种约定,对于解释器本身的实现来说,没有增加任何新的功能实现。将语言特性层面的事情前移到代码风格约定上去解决。既然一个多行字符串变量可以起到注释的作用,那么就没有必要再引入不同的语法,在这种情况下作为注释的字符串,就是注释。

这种在用户层面定义功能,但是实际上“偷懒”的做法在软件开发中比比皆是。微软在早期推出过一款叫做 IE 的浏览器,这款浏览器具有“收藏夹”功能,现在的浏览器也有将这个功能叫做书签的。但是本质上,微软没有为收藏夹开发什么实质的功能——收藏夹的本质其实就是一个favourites目录的文件的列表,而每个文件就是一个指向某个网页的快捷方式而已。而微软的Word中有一个"首字下沉"的功能,听上去很高大上,其实它不过是一个宏,将第一个字装入一个嵌入正文环绕的文字框,并且改大字体。以上两例设计,显然也不能不承认对应的功能的存在。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7774011
  • 除此之外, 这篇博客: python中的抽象类中的 1.首先知道python中的抽象类其实就是一种代码规范,和前面两篇文章python中的单继承和python中的多继承说的都是一个道理归根到底都是为了代码规范,同样也是从Java中继承的思想,抽象类一般都是单继承,由于多个子类都需要继承同一个类,所以可以在抽象类中实现具体的方法,但是子类中还是要实现具体的方法,看下面的例子,抽象类中实现了文件打开和关闭操作,但是子类中还是定义了 读写功能,为了理解的简便还是可以直接理解成抽象类中不实现具体的方法,子类中必须实现具体的方法 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:
    import abc #利用abc模块实现抽象类
    
    class All_file(metaclass=abc.ABCMeta):
        all_type='file'
        @abc.abstractmethod #定义抽象方法,无需实现功能
        def read(self):
            '子类必须定义读功能'
            with open('filaname') as f:
                pass
    
        @abc.abstractmethod #定义抽象方法,无需实现功能
        def write(self):
            '子类必须定义写功能'
            pass
    
    class Txt(All_file): #子类继承抽象类,但是必须定义read和write方法
        def read(self):
            print('文本数据的读取方法')
        def write(self):
            print('文本数据的读取方法')
    
    class Sata(All_file): #子类继承抽象类,但是必须定义read和write方法
        def read(self):
            print('硬盘数据的读取方法')
    
        def write(self):
            print('硬盘数据的读取方法')
    
    class Process(All_file): #子类继承抽象类,但是必须定义read和write方法
        def read(self):
            print('进程数据的读取方法')
    
        def write(self):
            print('进程数据的读取方法')
    
    wenbenwenjian=Txt()
    
    yingpanwenjian=Sata()
    
    jinchengwenjian=Process()
    
    #这样大家都是被归一化了,也就是一切皆文件的思想
    wenbenwenjian.read()
    yingpanwenjian.write()
    jinchengwenjian.read()
    
    print(wenbenwenjian.all_type)
    print(yingpanwenjian.all_type)
    print(jinchengwenjian.all_type)
    
    # 抽象类 : 规范
    # 一般情况下 单继承 能实现的功能都是一样的,所以在父类中可以有一些简单的基础实现
    # 多继承的情况 由于功能比较复杂,所以不容易抽象出相同的功能的具体实现写在父类中
    
    
    # 抽象类还是接口类 : 面向对象的开发规范 所有的接口类和抽象类都不能实例化
    # java :
    # java里的所有类的继承都是单继承,所以抽象类完美的解决了单继承需求中的规范问题
    # 但对于多继承的需求,由于java本身语法的不支持,所以创建了接口Interface这个概念来解决多继承的规范问题
    
    # python
    # python中没有接口类  :
      #  python中自带多继承 所以我们直接用class来实现了接口类
    # python中支持抽象类  : 一般情况下 单继承  不能实例化
      #  且可以实现python代码
    

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^