精华内容
下载资源
问答
  • 相反,在方法或属性名称的开头有一个下划线意味着您不应该访问此方法,因为它不是API的一部分 .class BaseForm(StrAndUnicode):def _get_errors(self):"Returns an ErrorDict for the data provided for ...

    Single underscore at the beginning:

    Python没有真正的私有方法 . 相反,在方法或属性名称的开头有一个下划线意味着您不应该访问此方法,因为它不是API的一部分 .

    class BaseForm(StrAndUnicode):

    def _get_errors(self):

    "Returns an ErrorDict for the data provided for the form"

    if self._errors is None:

    self.full_clean()

    return self._errors

    errors = property(_get_errors)

    (此代码段取自django源代码:django / forms / forms.py) . 在此代码中, errors 是公共属性,但此属性调用的方法_get_errors是"private",因此您不应访问它 .

    Two underscores at the beginning:

    这引起了很多困惑 . 它不应该用于创建私有方法 . 它应该用于避免您的方法被子类覆盖或意外访问 . 我们来看一个例子:

    class A(object):

    def __test(self):

    print "I'm a test method in class A"

    def test(self):

    self.__test()

    a = A()

    a.test()

    # a.__test() # This fails with an AttributeError

    a._A__test() # Works! We can access the mangled name directly!

    输出:

    $ python test.py

    I'm test method in class A

    I'm test method in class A

    现在创建一个子类B并为__test方法进行自定义

    class B(A):

    def __test(self):

    print "I'm test method in class B"

    b = B()

    b.test()

    输出将是....

    $ python test.py

    I'm test method in class A

    正如我们所看到的,A.test()没有像我们预期的那样调用B .__ test()方法 . 但事实上,这是__的正确行为 . 这两种方法调用__test()会自动重命名(损坏)到_A__test()和_B__test(),因此它们不会意外覆盖 . 当您创建以__开头的方法时,这意味着您不希望任何人能够覆盖它,并且您只打算从其自己的类中访问它 .

    Two underscores at the beginning and at the end:

    当我们看到像 __this__ 这样的方法时,请查看't call it. This is a method which python is meant to call, not you. Let':

    >>> name = "test string"

    >>> name.__len__()

    11

    >>> len(name)

    11

    >>> number = 10

    >>> number.__add__(40)

    50

    >>> number + 50

    60

    总有一个操作符或本机函数调用这些魔术方法 . 有时它只是在特定情况下的钩子python调用 . 例如,在调用 __new__() 构建实例后创建对象时调用 __init__() ...

    我们来举个例子......

    class FalseCalculator(object):

    def __init__(self, number):

    self.number = number

    def __add__(self, number):

    return self.number - number

    def __sub__(self, number):

    return self.number + number

    number = FalseCalculator(20)

    print number + 10 # 10

    print number - 20 # 40

    有关更多详细信息,请参阅PEP-8 guide . 有关更多魔术方法,请参阅this PDF .

    展开全文
  • (我认为它们都包括“引擎”,还有一个包括“模板”,如果有帮助的话)第一种方法允许子类重写public catch方法,例如在核心实现之前或之后添加一些额外的工作,但是仍然调用_catch方法来完成大部分工作。...

    通常,这种设计用在两个相关(但几乎相反)的模式中,我不知道“设计模式”的名称。(我认为它们都包括“引擎”,还有一个包括“模板”,如果有帮助的话)

    第一种方法是允许子类重写public catch方法,例如在核心实现之前或之后添加一些额外的工作,但是仍然调用_catch方法来完成大部分工作。例如:Class Pokemon(object):

    def __init__(self, name):

    self.name = name

    def _catch(self, pokeball):

    ''' actual implementation here'''

    # hundreds of lines of complex code

    print(pokeball)

    return pokeball

    def catch(self, pokeball):

    print('Gotta catch em all')

    return self._catch(pokeball)

    class Pikachu(Pokemon):

    def catch(self, pokeball):

    print('Pikachu')

    return self._catch(pokeball)

    这允许Pikachu重写实现的“非核心”部分(只有几行),而不重写“核心”部分(数百行)。在

    这种模式在Python中并不像在Java中那样常见,但有时确实有意义。在

    另一种方法是让基类将实现分解成单独的部分,每个部分都可以由子类重写,而不必替换其他所有部分。例如:

    ^{pr2}$

    那么,为什么要使用前导下划线呢?在

    前导的单下划线表示“按惯例私有”。对于一个方法名,尤其是,*这是对人类读者的一个提示,即有些东西不是API的一部分。{cd2}中的任何人都不应该调用cd2},因为任何人都不应该调用cd2}方法。在<>这通常是一个很好的匹配,你可以在java或C++中使用^ {CD7}}方法,这正是你使用这些语言中的两种设计模式的方法,即使它不是真正意义上的相同的东西。在

    前导双下划线(没有尾随的双下划线)表示不同的含义。在方法名或其他属性中,这意味着名称应该是“混乱的”,这样子类或超类在打算定义和使用自己的私有名称时更难意外地调用或重写它。在<>通常,这是一个很好的匹配,你可以在java或C++中做^ {< CD8>}方法或成员,但是它比一个下划线从^ {< CD7>}更远。在

    在其他一些地方,它确实有一点点的意义。例如,如果您没有在mod中指定__all__,则带有前导下划线的模块全局将被from mod import *跳过。

    展开全文
  • 名称前的双下划线:以双下划线开头的属性、方法表示避免父类的属性和方法被子类轻易的覆盖,一般不建议这样定义属性和方法,除非你自己将要做什么。 名称前后的双下划线:这类方法Python内部.
    • 单下划线(_): 在交互解释器中,表示上一条语句执行输出的结果。另外,单下划线还可以作为特殊的临时变量,表示在后面将不会在用到这个变量。
    • 名称前的单下划线:只能在内部使用,是API中非公开的部分,不能被 import * 和 from import *导入程序中,除非在all列表中包含了以单下划线开头的属性、方法以及类。
    • 名称前的双下划线:以双下划线开头的属性、方法表示避免父类的属性和方法被子类轻易的覆盖,一般不建议这样定义属性和方法,除非你自己将要做什么。
    • 名称前后的双下划线:这类方法是Python内部定义的方法,你可以重写这些方法,这样Python就可以调用这个重写的方法以及利用操作符。

    下划线于双下划线的区别

    展开全文
  • <p>I was just going thorugh one of the twig files in the bolt default theme template and i came across the following line of code: <pre><code>{{ __("Unfortunately, no content could be found....
  • (1)_xxx"单下划线" 开始的成员变量相当于私有变量,也叫做保护变量,意思只有类实例和子类实例能访问到这些变量,需通过类提供的接口进行访问(可以定义有点像java中的getter、setter方法,借助方法访问,而不是...

    (1)_xxx

    "单下划线 " 开始的成员变量相当于私有变量,也叫做保护变量,意思是只有类实例和子类实例能访问到这些变量,需通过类提供的接口进行访问(可以定义有点像java中的getter、setter方法,借助方法访问,而不是直接对变量动刀子);不能用'from module import *'导入。其实,Python并没有真正的私有化支持,用下划线得到的是伪私有,也就是说如果你强行要用也是可以的,但不符合python的规范。我们应该尽量避免重新定义以下划线开头的变量。

    (2)__xxx

    双下划线:类中的私有变量/方法名 (Python的函数也是对象,所以成员方法称为成员变量也行得通)。" 双下划线 " 开始的是私有成员,意思是只有类对象自己能访问,连子类对象也不能访问到这个数据。

    (3)__xxx__

    系统定义名字,前后均有一个“双下划线” 代表python里特殊方法专用的标识,如 __init__()代表类的构造函数。类似__xxx__这样的变量是特殊变量,可以被直接引用,但是有特殊用途,比如一个模块的__author__,__name__就是特殊变量,模块定义的文档注释(就是模块开头的字符串)也可以用特殊变量__doc__访问,我们自己的变量一般不要用这种变量名。

    总结就是说,这些写法,其实都是python的一些约定俗成的规范,虽然不是强行的规定(即使你不遵守,强行调用、访问,也不会崩溃报错),但大家还是要遵守!不然在代码交接、传承使用上就会出问题啦。

    ————————————————

    版权声明:本文为CSDN博主「奔跑的Yancy」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

    原文链接:https://blog.csdn.net/lyxleft/article/details/85691186

    展开全文
  • 以Word为例,下划线粗细不一样是因为下划线是字体的一部分,会随着字体的变化而变化,字体不一样下划线也不一样。建议可以单独设置下划线的粗细。Microsoft Office Word是微软公司的一个文字处理器应用程序。它最初...
  • 平时写代码经常碰到下划线、双下划线等“奇怪”的写法,今天特意花时间彻底解决这个问题 文章目录前置单下划线:_var后置单下划线:var_前置双下划线 前置单下划线:_var 意义:python社区约定好单下划线表达的...
  • 小编典典单下划线类中带有下划线的名称仅为了向其他程序员表明该属性或方法旨在私有。...双下划线(名称改写)从Python文档:形式上的任何标识符__spam(至少两个前导下划线,至多一个尾随下划线)在文本上均...
  • 什么有的内核函数前面会有“_ ”双下划线 在我们阅读内核代码时,经常会看到有的函数名称前面会带有“ _”的双下划线,而有些又没有,这个有什么用呢? 原来内核API函数具有这种名称的,通常都一些接口的底层...
  • 1.写在前面今天遇到了slots,,所以我就想了解下python中那些双下划线开头的那些函数都干啥用用的,翻到了下面这篇博客,看着很全面,我只了解其中的一部分,还不敢乱下定义。其实如果足够了解一些知识,知道自己想...
  • 对于半私有变量,建议使用单下划线,对于完全私有变量,建议使用双下划线。引用PEP-8-_single_leading_underscore:“内部使用”指标较弱。例如,从M import *不会导入名称以下划线开头的对象。示例以下代码显示...
  • 什么是 Python? Python 之父 Guido van Rossum 说:Python一种高级程序语言,其核心设计哲学代码可读性和语法,能够让程序员用很少的代码来表达自己的想法。对于我来说,学习 Python 的首要原因,Python 一...
  • 在学习Python的时候,很多人都不理解为什么在方法(method)前面会加好几个下划线,有时甚至两边都会加,比如像 __this__ 这种。在我看到上面的文章之前,我一直以为Python中这些下划线的作用就像Golang中方法/函数的...
  • 双下划线任何__spam形式(至少两个下划线开头,至多一个下划线结尾)都代替_classname__spam,其中classname当前类的名字。This mangling is done without regard to the syntactic position o...
  • 在学习Python的时候,很多人都不理解为什么在方法(method)前面会加好几个下划线,有时甚至两边都会加,比如像 __this__ 这种。在我看到上面的文章之前,我一直以为Python中这些下划线的作用就像Golang中方法/函数...
  • ... <p>I did some google research and there are a lot of explanations regarding double colons (::), but almost nothing on "::_", one of the files that contain this operator is joomla-site-root/mod_...
  • 在学习Python的时候,很多人都不理解为什么在方法(method)前面会加好几个下划线,有时甚至两边都会加,比如像 __this__ 这种。在我看到上面的文章之前,我一直以为Python中这些下划线的作用就像Golang中方法/函数的...
  • 在学习Python的时候,很多人都不理解为什么在方法(method)前面会加好几个下划线,有时甚至两边都会加,比如像__this__这种。在我看到上面的文章之前,我一直以为Python中这些下划线的作用就像Golang中方法/函数的...
  • 今天遇到了__slots__,,所以我就想了解下python中那些双下划线开头的那些函数都干啥用用的,翻到了下面这篇博客,看着很全面,我只了解其中的一部分,还不敢乱下定义。 其实如果足够了解一些知识,知道自己想要...
  • 今天遇到了__slots__,,所以我就想了解下python中那些双下划线开头的那些函数都干啥用用的,翻到了下面这篇博客,看着很全面,我只了解其中的一部分,还不敢乱下定义。 其实如果足够了解一些知识,知道自己想要...
  • 我们大家在学习Python的时候,好像很多人都不理解为什么在方法(method)前面会加好几个下划线,有时甚至两边都会加,比如像__this__这种。在我看到上面的文章之前,我一直以为Python中这些下划线的作用就像Golang中...
  • 双下划线方法类的特殊方法,双下划线加方法名加双下划线进行定义的 而这样的写法就表示,它其实有特殊意义的 (没有特殊意义我提他干撒,不是神经病嘛) 其实啊,双下划线方法更多python的源码开发者使用...
  • 双下划线方法类的特殊方法,双下划线加方法名加双下划线进行定义的 而这样的写法就表示,它其实有特殊意义的 (没有特殊意义我提他干撒,不是神经病嘛) 其实啊,双下划线方法更多python的源码开发者使用...
  • 1.写在前面今天遇到了__slots__,,所以我就想了解下python中那些双下划线开头的那些函数都干啥用用的,翻到了下面这篇博客,看着很全面,我只了解其中的一部分,还不敢乱下定义。其实如果足够了解一些知识,知道...
  • 在python类中,我们经常可以看到类似于_object,__object,__object__的对象,那么这些...双下划线 表示类中的私有成员,只能在本类中访问,Python设计此的真正目的仅仅为了避免子类覆盖父类的方法。类似与C++中的pr...
  • 1.写在前面今天遇到了__slots__,,所以我就想了解下python中那些双下划线开头的那些函数都干啥用用的,翻到了下面这篇博客,看着很全面,我只了解其中的一部分,还不敢乱下定义。其实如果足够了解一些知识,知道...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 429
精华内容 171
关键字:

双下划线是什么