精华内容
下载资源
问答
  • 内容目录单下划线双下划线的区别​ Python用下划线作为前缀和后缀指定特殊变量和定义方法,主要有如下四种形式:单下划线(_)名称前的单下划线(如:_name)名称前的双下划线(如:__name)名称前后的双下划线(如:_ ...

    内容目录

    单下划线与双下划线的区别

    ​ Python用下划线作为前缀和后缀指定特殊变量和定义方法,主要有如下四种形式:

    单下划线(_)

    名称前的单下划线(如:_name)

    名称前的双下划线(如:__name)

    名称前后的双下划线(如:_ init _)

    单下划线(_)

    ​ 只有单划线的情况,主要有两种使用场景:

    ​ 1、在交互式解释器中,单下划线“_”代表的是上一条执行语句的结果。如果单下划线前面没有语句执行,交互式解释器将会报单下划线没有定义的错误。也可以对单下划线进行赋值操作,这时单下划线代表赋值的结果。但是一般不建议对单下划线进行赋值操作,因为单下划线内建标识符。

    "", line 1, in 

    '_' is not defined

    "python"

    'python'

    'python'

    "Java"

    'Java'

    2、单下划线“_”还可以作为特殊的临时变量。如果一个变量在后面不会再用到,并且不想给这个变量定义名称,这时就可以用单下划线作为临时性的变量。比如对for循环语句遍历的结果元素并不感兴趣,此时就可以用单下划线表示。

    # _ 这个变量在后面不会用到

    for _ in range(5):

    "Python")

    名称前的单下划线(如:_name)

    ​ 当在属性和方法前面加上单下划线“_”,用于指定属性和方法是“私有”的。但是Python不像Java一样具有私有属性、方法、类,在属性和方法之前加单下划线,只是代表该属性、方法、类只能在内部使用,是API中非公开的部分。如果用from import * 和 from import * 时,这些属性、方法、类将不被导入。

    # Test.py 文件

    #普通属性

    "Java"

    #单下划线属性

    "Python"

    #普通方法

    def  method():

    "我是普通方法")

    #单下划线方法

    def _otherMethod():

    "我是单下划线方法")

    #普通类

    class PClass(object):

    def __init__(self):

    "普通类的初始化")

    #单下划线类

    class _WClass(object):

    def __init__(self):

    "单下划线类的初始化")

    ​ 将上述的Test.py文件导入,进行测试。

    from Test import *

    'Java'

    "", line 1, in 

    '_otherValue' is not defined

    "", line 1, in 

    '_otherMethod' is not defined

    "", line 1, in 

    '_WClass' is not defined

    ​ 从上面的结果可以看出,不管是属性、方法和类,只要名称前面加了单下划线,都不能导出。

    ​ 如果对程序进行修改,将在开头加入_ all _,结果会是如何?

    # Test.py 文件

    #将普通属性、单下划线的属性、方法、和类加入__all__列表

    "value","_otherValue","_otherMethod","_WClass"]

    #普通属性

    "Java"

    #单下划线属性

    "Python"

    #普通方法

    def  method():

    "我是普通方法")

    #单下划线方法

    def _otherMethod():

    "我是单下划线方法")

    #普通类

    class PClass(object):

    def __init__(self):

    "普通类的初始化")

    #单下划线类

    class _WClass(object):

    def __init__(self):

    "单下划线类的初始化")

    ​ 将上述修改过的Test.py文件导入,进行测试。

    from Test import *

    'Java'

    'Python'

    "", line 1, in 

    'method' is not defined

    "", line 1, in 

    'PClass' is not defined

    ​ _ all _是一个字符串列表,不管是普通的还是单下划线的属性、方法和类,都将导出来,使用其他不在这个字符列表上的属性、方法和类,都会报未定义的错误。

    ​ 不管是属性、方法和类,只要名称前面加了单下划线,都不能导入。除非是模块或包中的“_ all_”列表显式地包含了它们。

    名称前的双下划线(如:__name)

    ​ 我们先看看下面的程序:

    class Method(object):

    # 构造器方法

    def __init__(self, name):

    # 双下划线属性

    # 普通方法

    def sayhello(self):

    "Method say hello!")

    # 双下划线方法

    def __sayhi(self):

    "Method say hi!")

    # 初始化Method

    "Python")

    # 调用sayhello方法

    # 调用sayhi方法

    # 输出属性__name

    ​ 上面的程序定义了一个类,这个类有三个方法,一个构造器方法,一个普通方法,一个双下划线方法,以及包括一个双下划线的属性。上面的结果输出的是什么?很多读者可能认为输出的结果如下:

    ​ 那么恭喜你,上面的输出结果是错误的,实际输出的结果为:

    "", line 18, in 

    'Method' object has no attribute '__sayhi'

    ​ 实际上,当对象调用__sayhi()方法时,将会报Method类没有这个方法属性的错误。那如何去调用以双下划线开头的方法和属性?Python这样设计的目的是什么?

    ​ 首先回答第一个问题,读者看完下面的程序就知道怎么调用了。

    class Method(object):

    def __init__(self, name):

    def sayhello(self):

    "Method say hello!")

    def __sayhi(self):

    "Method say hi!")

    # 初始化Method

    "Python")

    # 调用sayhello方法

    # 调用sayhi方法

    #m.__sayhi()

    # 输出属性__name

    #print(m.__name)

    ​ 输出结果如下:

    say hello!

    say hi!

    ​ 我们从上面的程序中可以很清楚的看到,如果要调用以双下划线开头的方法和属性,只要以“类名_方法(属性)”的形式就可以实现方法或者属性的访问了。类前面是单下划线,类名后面是双下划线,然后再加上方法或者属性。但是并不建议调用,因为这是Python内部进行调用的形式。

    ​ 回答完第一个问题,我们看看第二个问题,Python这样设计的目的是什么?

    ​ 有很多人认为,Python以双下划线开头的方法和属性表示私有的方法和属性,实际上这样的理解不太准确,也不能说完全错误的。但是这并不是Python设计的目的和初衷,我们先看看下面一段程序和程序运行结果:

    class AMethod(object):

    def __method(self):

    "__method in class Amethod!")

    def method(self):

    "anthod method in class AMethod!")

    class BMethod(AMethod):

    def __method(self):

    "__method in class Bmethod!")

    if __name__=="__main__":

    "调用AMethod的method方法")

    "调用BMethod的method方法")

    ​ 上面的程序定义了两个类,一个是AMethod类,另外一个是继承了AMethod类的BMethod类。在AMethod类中,定义了两个方法,一个是以双下划线开头的__method方法,另外一个是普通方法。在BMethod类中,重写了AMethod类中的__method方法。

    ​ 程序运行结果:

    in class Amethod!

    anthod method in class AMethod!

    BMethod的method方法

    __method in class Amethod!

    anthod method in class AMethod!

    ​ 运行结果并不是我们想要的结果,b.method()并没有调用BMethod类的__method方法,而这个设计的实际目的是为了避免父类的方法被子类轻易的覆盖。

    名称前后的双下划线(如:_ init _)

    ​ 在Python类中,我们可以常常看到类似于“_ init _ ”的方法,这表示在Python内部调用的方法,一般不建议在程序中调用。比如,当调用len()方法时,实际上调用了 Python中内部的 _ len _ 方法,虽然不建议调用这种以双下划线开头以及结尾的方法,但是可以对这些方法进行重写。比如下面的例子:

    class Number(object):

    def __init__(self, number):

    def __add__(self, number):

    # 重写方法,返回两个数的差值

    return self.number - number

    def __sub__(self, number):

    # 重写方法,返回两个数的和

    return self.number + number

    def __str__(self):

    # 重写方法,返回字符串

    return str(self.number)

    100)

    # 100 调用了__str__方法

    50) # 50 + 调用了__add__方法

    -20) # 120 -调用了__sub__方法

    ​ 相信看了上面所有对Python中下划线作用的讲解,完全能够理解上述四种下划线所表示的意义。最后将对上面的,进行总结。

    总结

    单下划线(_): 在交互解释器中,表示上一条语句执行输出的结果。另外,单下划线还可以作为特殊的临时变量,表示在后面将不会在用到这个变量。

    名称前的单下划线:只能在内部使用,是API中非公开的部分,不能被 import * 和 from import *导入程序中,除非在all列表中包含了以单下划线开头的属性、方法以及类。

    名称前的双下划线:以双下划线开头的属性、方法表示避免父类的属性和方法被子类轻易的覆盖,一般不建议这样定义属性和方法,除非你自己将要做什么。

    名称前后的双下划线:这类方法是Python内部定义的方法,你可以重写这些方法,这样Python就可以调用这个重写的方法以及利用操作符。

    展开全文
  • python类内部部分双下划线特殊方法__setattr__, __getattr__, __delattr__, hasattr __getattribute__ __getitem__(),__setitem__(), __delitem__()主程序如下:classFoo:def_inif(self,pname):self.pname=...

    python类内部部分双下划线特殊方法

    __setattr__, __getattr__, __delattr__, hasattr __getattribute__ __getitem__(),__setitem__(), __delitem__()

    主程序如下:classFoo:def_inif(self,pname):

    self.pname=pnamedeffunc():print('i'm func')

    def __getattr__(self, item):print('提示:属性[%s]不存在。'%item)def __setattr__(selft, key, value):print('提示:属性赋值操作:[%s=%s]'%(key,value))

    self.__dict__[key]=value#self.key=value

    #无法使用,会无限递归,这就是调用本身__setattr__

    def __delattr__(self, item):print('提示:删除属性操作:删除[%s]'%item)if item in self.__dict__:

    self.__dict__.pop(item)#del self.item #无限递归了

    #无法使用,会无限递归,这就是调用本身__delattr__

    1、得到属性值。__getattr__方法的运行流程,以及getattr的运行流程。当不存在属性名/方法名时,查找__getattr__()方法是否存在,存在即执行它。不存在再查看有没有默认参数,有则返回,没有则报错。

    2、判断属性/方法名是否存在。__getattr__方法的运行流程,以及hasattr的运行流程

    3、给属性赋值。setattr(对象名, 属性名字符串,属性值),例如:setattr(f1,'y','ccc')。

    当__setattr__方法存在时,执行它内部的程序,必须执行:self.__dict__[key]=value,要不然不会进行赋值。(该方法默认返回值是None,一般不会使用)

    4、删除属性。delattr(对象名, 属性名字符串),例如:delattr(f1,'y')。

    当__delattr__方法存在时,执行它内部的程序,必须执行:

    if item in self.__dict__:#要进行判断,如果键不存在,pop会出错。

    self.__dict__.pop(item)

    要不然不会进行删除。(该方法默认返回值是None,一般不会使用)

    5.__getattribute__方法,只要调用属性就会进行__getattribute__方法,只有遇到raise AttributeError()(必须是AttributeError异常)才会执行__getattr__

    classFoo:def __init__(self, guestname, guestmobile):

    self.guestname=guestname

    self.guestmobile=guestmobiledef __getattribute__(self, item):print('获取属性值操作 %s'%item)if item != 'guestname':raiseAttributeError()def __getattr__(self, item):print('找不到属性 %s'%item)

    f= Foo('小王','13945784807')

    f.guestname

    f.guestage

    执行结果:

    获取属性值操作 guestname

    获取属性值操作 guestage

    找不到属性 guestage

    6.操作对象的属性/方法名时,像字典一样操作__getitem__(),__setitem__(), __delitem__(),具体操作字典方法要在其中自己写。以下代码只列了setitem,其余的都操作self.__dict[xx]=xx就可以。

    classFoo:passf=Foo()

    f['a']=12执行结果:

    TypeError:'Foo' object does not support item assignment

    classFoo:def __setitem__(self, key, value):print('run setitem')

    self.__dict__[key]=value

    f=Foo()

    f['a']=12

    print(f.a)

    执行结果:

    run setitem12

    口诀:

    对象/类的 点的操作,都和attr相关

    对象/类的 中括号的操作,都和item相关

    7.__str__和 __repr__,对象返回值的方法,他们内部必须以return返回,必须返回str类型的值。

    a.当编译器提示性返回时,就调用__repr__()

    b.当print或者str(对象实例名),就调用__str__()

    >>> classFoo:

    ...def __str__(self):

    ...return 'ggg'...def __repr__(self):

    ...return 'xxx'...>>> f =Foo()>>>f

    xxx>>> classFoo:

    ...def __str__(self):

    ...return 'ooo'...>>> f=Foo()>>>f<__main__.foo object at>

    >>> print(f)

    ooo>>>

    口诀:print()方法变量方法顺序,找str,再找repr

    '''

    str函数或者print函数--->obj.__str__()

    repr或者交互式解释器--->obj.__repr__()

    如果__str__没有被定义,那么就会使用__repr__来代替输出

    注意:这俩方法的返回值必须是字符串,否则抛出异常

    '''

    展开全文
  • 双下划线被称为“dunder”,它们调用特殊的方法,这些方法可以对对象产生一些非常巧妙的效果。它们不会改变意义,但它们是非常神奇的伏都教,是你腰带上的好工具。在__init__是一个神奇的方法,用于声明对象初始化...

    啊哈!我看你已经发现了神奇的方法。在

    双下划线被称为“dunder”,它们调用特殊的方法,这些方法可以对对象产生一些非常巧妙的效果。它们不会改变意义,但它们是非常神奇的伏都教,是你腰带上的好工具。在

    __init__是一个神奇的方法,用于声明对象初始化时发生的事情。它前面只有__new__。在

    我使用的这些方法中最有用的是__dict__方法。{dictionary}中的所有属性都可以转换成类中的值。虽然我不认为用它作为文件名会有用。在

    下面是一个例子:class Thing(object):

    def __init__(self): ##Init here is a magic method that determines what haps first

    self.tint = "black"

    self.color = "red"

    self.taste = "tangy"

    thing = Thing()

    dictionary_from_class = {}

    for key in thing.__dict__.keys(): ##returns all key values. here: "tint, color, taste"

    dictionary_from_class[key] = thing.__dict__[key]

    在python中启动Idle,并尝试一下。祝你练习Python伏都教好运!在

    对不起,我很快就看了你的问题,让我提一下,因为我的答案中可能没有提到这个问题:如果文件名是__init__.py,它的作用与我之前提到的类似。它调用初始化,python将在到达该文件夹以供模块使用时立即执行这些操作。也就是说,如果因为调用了该文件而正在读取该文件,例如引用了一个模块文件夹,在这种情况下,您需要一个__init__.py文件来让python在该文件夹中识别它。您可以使用任何魔术方法作为名称,以便在使用时获得类似的功能。在

    我希望澄清是有用的。在

    -约瑟夫

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

    下划线于双下划线的区别

    展开全文
  • )l名称前的单下划线(如:_name)l名称前的双下划线(如:__name)l名称前后的双下划线(如:__init__)(一)单下划线(_)只有单下划线的情况,主要有两种使用场景:1、在交互式解释器中,单下划线“_”代表的是上一执行...
  • 1.在python的解释器中,_是上一语句的执行结果,最早是CPython施行,到现在其他类型的解释器也在使用2.上面的语句执行结果是在屏幕上打印十行hello world,我们并不需要0-9这些数字,所以没必要给他一个变量名‘_...
  • 有时候我们需要根据实际的情况去添加:单实线下划线、虚线下划线双下划线、波浪线等等下划线条。许多朋友在对文本添加下划线的时候,基本都是选择内容后直接点击开始菜单栏下方的U来操作。其实添加下划线还有更加...
  • word中下划线怎么弄一细一粗的,是双下划线哦????设置方法:1、选中需要设置的文字;2、单击页面布局----页面边框按钮;3、弹出边框和底纹对话框,选择边框选项卡,在样式处选择如图所示的上细下粗线型,单击...
  • 有时候我们需要根据实际的情况去添加:单实线下划线、虚线下划线双下划线、波浪线等等下划线条。许多朋友在对文本添加下划线的时候,基本都是选择内容后直接点击开始菜单栏下方的U来操作。其实添加下划线还有更加...
  • 函数使用单下划线_开头使用单下划线(_)开头的函数_func不能被模块外部以: from module import *形式导入。...类属性和类方法使用双下划线__开头__开头为私有类型属性和方法,仅允许类内部访问,类...
  • 下划线在类中,带有前导下划线的名称只是向其他程序员指示该属性或方法旨在是私有的。然而,没有什么特别的名称本身。_single_leading_underscore: weak “internal use” indicator. E.g. from M import * does ...
  • 详解Python类中的特殊方法(前后都有双下划线的方法)-len、str、getitem、iter、getattr、call等类中定义的一些特殊方法,也就是方法名称前后都有双下划线标识的方法,都具有特殊的意义,重写这些方法可以帮助类更好...
  • 必知必会13 <1> all(): 查询所有结果 <2> get(**kwargs): 返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有都会抛出错误。 <3> ...
  • 神器的双下划线查询 #查询小于35岁 res=models.User.objects.filter(age__lt=35) #小于等于 res=models.User.objects.filter(age__lte=30) #年龄18,或者32,或者40 res=models.User.objects.filter(age__in=[18,32...
  • https://www.cnblogs.com/haiyan123/p/7738435.html ... 一、添加表记录 对于单表有两种方式 # 添加数据的两种方式 ... # 方式一:实例化对象就是一表记录 Frank_obj = models.Student(nam...
  • 在 python 中,下划线命名规则往往令初学者相当 疑惑:单下划线双下划线双下划线还分前后……那它们的作用与使用场景 到底有何区别呢?今天 就来聊聊这个话题。1、单下划线(_)通常情况下,单下划线(_)会在以下3...
  • 今天给大家介绍一下在Word里采用制表位制作下划线,我们经常在Word里制作一些毕业论文、合同或项目文件的封面时,大家都会遇到需要输入多相同长度的下划线,那么采用什么办法可以快速的添加下划线呢?接下来我们来...
  • 下划线双下划线双下划线还分前后……那它们的作用与使用场景 到底有何区别呢? 文章来源:http://www.cnblogs.com/MUMO/p/5718578.html 1、单下划线(_) 通常情况下,单下划线(_)会在以下3种场景中使用...
  • 在 python 中,下划线命名规则往往令初学者相当 疑惑:单下划线双下划线双下划线还分前后……那它们的作用与使用场景 到底有何区别呢?今天 就来聊聊这个话题。 1、单下划线(_) 通常情况下,单下划线(_)会...
  • Python变量名必须以字母或下划线开头,并且区分字母大小写。答:对在双子叶植物茎的次生结构中,次生木质部主要是由( )分裂、生长和分化而形成的。答:纺锤状原始细胞中国自己修建的第一铁路是()答:唐胥铁路用两种...
  • 线条

    2012-02-09 15:30:53
    线条 锦绣:颜色在画面上的作用,谁都清楚,可是在单色显示条件下,就不好用了 源明:这时,除了在字体、字形上改变外,还可以用辅助的方法 ...锦绣:俺看看,嗯,有单下划线双下划线、会计用单下划线、会计用
  • 正确的做法应该是如果你需要绘制直线,只要连续输入三个或者三个以上的“=” ,然后回车,直线就自动生成了;如果你需要绘制波浪线,只要连续输入三个或者三个以上的“~” ,然后回车,波浪线就自动生成了;...
  • # -*- encoding: utf-8 -*- import os ...可见度种类: public, proteced(单下划线的属性)和private(双下划线的属性) 2 private属性 含义: 两个下划线开头的属性, 例如: self.__private_field =...
  • 基于双下划线的查询 # 价格 大于 小于 大于等于 小于等于 filter(price__gt='90') # 筛选出大于90 filter(price__lt='90') # 筛选出小于90 filter(price_gte='90') # 筛选出大于等于90的 filter...
  • 在 python 中,下划线命名规则往往令初学者相当 疑惑:单下划线双下划线双下划线还分前后……那它们的作用与使用场景 到底有何区别呢?今天 就来聊聊这个话题。1、单下划线(_)通常情况下,单下划线(_)会在以下3...
  • dango-orm单表操作知识点增加操作查询操作修改操作删除操作双下划线查询必会13api 增加操作 查询操作 修改操作 删除操作 双下划线查询 必会13api
  • 【单选题】Python语句print(type([1,2,3,4])的... (3.0分)【填空题】类的私有成员属性是使用(单下划线双下划线) 开头的变量,答 __ ____【填空题】Python语句print('%d%%%d'%(3/2, 3%2))的运行结果是( 1 )。【填...

空空如也

空空如也

1 2 3 4 5 ... 8
收藏数 152
精华内容 60
关键字:

双条下划线