首页 > 编程语言 > 详细

python中单下划线和双下划线的区别

时间:2019-08-25 15:06:25      阅读:75      评论:0      收藏:0      [点我收藏+]

1.单下划线

在python中单下划线代表私有,但也仅仅是名义上的私有,只是一种规范,告诉人们不要在外部使用它。但实际上python没有真正意义上的私有,我们一样可以在外部去调用私有方法或属性。

class BaseForm(StrAndUnicode):
    def _get_errors(self):
        ‘‘‘
        Returns an ErrorDict for the data provided for the form
        :return: 
        ‘‘‘
        if self._errors is None:
            self.full_clean()
        return self._errors

    errors = property(_get_errors)

该代码片段来自Django源码(django/forms/forms.py)。这段代码的设计就是errors属性是对外API的一部分,如果你想获取错误详情,应该访问errors属性,而不是(也不应该)访问_get_errors方法。实际上我们仍然可以使用对象在外部调用它。

baseform = BaseForm()
baseform._get_errors()

2.双下划线

双下划线使用来避免父类方法被子类方法覆盖的。双下划线方法的本质是在方法前加了_类名,我们可以使用对象._类名__方法名(),来在外部调用它。

class A(object):

    def __method(self):
        print("I‘m a method in class A")

    def method_x(self):
        print("I‘m another method in class A\n")

    def method(self):
        self.__method()
        self.method_x()


class B(A):

    def __method(self):
        print("I‘m a method in class B")

    def method_x(self):
        print("I‘m another method in class B\n")


if __name__ == __main__:
    print("situation 1:")
    a = A()
    a.method()

    b = B()
    b.method()

    print("situation 2:")
    #b.__method() 报错 ‘B‘ object has no attribute ‘__method‘
    a._A__method()

上面程序的执行结果为:

situation 1:
Im a method in class A
Im another method in class A

Im a method in class A
Im another method in class B

situation 2:
Im a method in class A

3.前后双下划线

前后双下滑线方法是python自己定义出来,供自己调用的。这些方法会在特定的条件下被触发执行。下面是常用的一些前后双下划线方法。

__str__   当将对象转换成字符串时会执行
__init__  初始化方法,为对象变量赋值
__new__ 构造方法,创建一个对象
__call__ 在对象后面加括号会执行该方法
__getattr__  当使用对象.属性时,若属性不存在会调用该方法
__setattr__ 当使用对象.属性 = 值,会调用该方法
__iter__ 类内部定义了该方法,对象就变成了可迭代对象
__add__  当两个对象使用+号会调用该方法
__enter__和__exit__ 上下文管理

class Foo(object):

    def __enter__(self):
        print(开始)
        return Foo()

    def __exit__(self, exc_type, exc_val, exc_tb):
        print(结束)


with Foo() as obj:   #with后面的Foo()会执行__enter__()方法,并将返回值赋给obj
    print(123)       #缩进代码执行完成后会执行__exit__()方法


#开始
#123
#结束

我们可以在自己的类中重写者些方法,以便实现特定的功能。

以上大部分内容参考自https://www.jb51.net/article/129534.htm

python中单下划线和双下划线的区别

原文:https://www.cnblogs.com/wang-kai-xuan/p/11407832.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!