精华内容
下载资源
问答
  • python双下划线函数

    2018-09-26 10:41:00
    __name__被调用为函数名(返回字符串) 如果是在装饰器里面,那么asd会被inner代替   解决这个问题 from functools import wraps def func(f): @wraps(f) def inner(*args, ** kwargs): print...
    def func(f):
        def inner(*args, **kwargs):
            print('1')
            ret = f(*args, **kwargs)
            print('2')
            return ret
        return inner
    
    @func
    def asd(bool):
        print('%s'%bool)
        return 'a'
    
    print(func.__name__)
    print(asd.__name__)

    func
    inner

     

    __name__被调用为函数名(返回字符串)

    如果是在装饰器里面,那么asd会被inner代替

     

    解决这个问题

    from functools import wraps
    def func(f):
        @wraps(f)
        def inner(*args, **kwargs):
            print('1')
            ret = f(*args, **kwargs)
            print('2')
            return ret
        return inner
    
    @func
    def asd(bool):
        print('%s'%bool)
        return 'a'
    
    print(func.__name__)
    print(asd.__name__)

     

    __doc__被调用显示函数说明(返回字符串)

    def asd(bool):
        '''这是asd函数'''
        print('%s'%bool)
        return 'a'
    print(asd.__doc__)

    这是asd函数

     

    转载于:https://www.cnblogs.com/daoyueweiku/p/9705542.html

    展开全文
  • 1.python 中__name__ = '__main__' 的作用如果我们是直接执行某个.py文件的时候,该文件中那么”__name__ == '__main__'“是True,但是我们如果从另外一个.py文件通过import导入该文件的时候,这时__name__的值就是...

    1.python 中__name__ = '__main__' 的作用

    如果我们是直接执行某个.py文件的时候,该文件中那么”__name__ == '__main__'“是True,但是我们如果从另外一个.py文件通过import导入该文件的时候,这时__name__的值就是我们这个py文件的名字而不是__main__。

    这个功能还有一个用处:调试代码的时候,在”if __name__ == '__main__'“中加入一些我们的调试代码,我们可以让外部模块调用的时候不执行我们的调试代码,但是如果我们想排查问题的时候,直接执行该模块文件,调试代码能够正常运行!

    2.其他常用

    x.__contains__(y) 等价于 y in x, 在list,str, dict,set等容器中有这个函数

    __base__, __bases__, __mro__, 关于类继承和函数查找路径的。

    class.__subclasses__(), 返回子类列表

    x.__call__(...) == x(...)

    x.__cmp__(y) == cmp(x,y)

    x.__getattribute__('name') == x.name == getattr(x, 'name'),  比__getattr__更早调用

    x.__hash__() == hash(x)

    x.__sizeof__(), x在内存中的字节数, x为class得话, 就应该是x.__basicsize__

    x.__delattr__('name') == del x.name

    __dictoffset__ attribute tells you the offset to where you find the pointer to the __dict__ object in any instance object that has one. It is in bytes.

    __flags__, 返回一串数字,用来判断该类型能否被序列化(if it's a heap type), __flags__ & 512

    S.__format__, 有些类有用

    x.__getitem__(y) == x[y], 相应还有__setitem__, 某些不可修改类型如set,str没有__setitem__

    x.__getslice__(i, j) == x[i:j], 有个疑问,x='123456789', x[::2],是咋实现得

    __subclasscheck__(), check if a class is subclass

    __instancecheck__(), check if an object is an instance

    __itemsize__, These fields allow calculating the size in bytes of instances of the type. 0是可变长度, 非0则是固定长度

    x.__mod__(y) == x%y, x.__rmod__(y) == y%x

    x.__module__ , x所属模块

    x.__mul__(y) == x*y,  x.__rmul__(y) == y*x

    __reduce__, __reduce_ex__ , for pickle

    __slots__ 使用之后类变成静态一样,没有了__dict__, 实例也不可新添加属性

    __getattr__ 在一般的查找属性查找不到之后会调用此函数

    __setattr__ 取代一般的赋值操作,如果有此函数会调用此函数, 如想调用正常赋值途径用 object.__setattr__(self, name, value)

    __delattr__ 同__setattr__, 在del obj.name有意义时会调用

    参考文档:

    展开全文
  • 我对这种行为有点困惑(使用python 3.2):class Bar:passbar = Bar()bar.__cache = Noneprint(vars(bar)) # {'__cache': None}class Foo:def __init__(self):self.__cache = Nonefoo = Foo()print(vars(foo)) # {'_F....

    我对这种行为有点困惑(使用python 3.2):

    class Bar:

    pass

    bar = Bar()

    bar.__cache = None

    print(vars(bar))        # {'__cache': None}

    class Foo:

    def __init__(self):

    self.__cache = None

    foo = Foo()

    print(vars(foo))        # {'_Foo__cache': None}

    我已经读了一些关于双下划线如何导致属性名被"损坏"的内容,但是在上面的两种情况下,我都希望相同的名称被损坏。

    对象名称前的单下划线和双下划线的含义是什么?

    你知道这是怎么回事吗?

    损坏的重点正是防止您的第二个案例正常工作。其目的是从外部代码隐藏属性。

    名称管理发生在评估class语句期间。在Bar的情况下,__cache属性不定义为类的一部分,而是在事实之后添加到特定对象中。

    (实际上,这可能并不完全正确。在评估__new__方法时,可能会出现名称混乱,我不知道。但是无论如何,您的__cache是显式地添加到单个对象中的,而不是由类代码添加的。)

    它在编译期间被损坏了。您可以使用dis.dis()函数来查看,只需运行import dis; dis.dis(Foo.__init__)即可查看名称是否已损坏。

    很有帮助,谢谢你的解释

    从文档中

    Private name mangling: When an identifier that textually occurs in a

    class definition begins with two or more underscore characters and

    does not end in two or more underscores, it is considered a private

    name of that class. Private names are transformed to a longer form

    before code is generated for them. The transformation inserts the

    class name in front of the name, with leading underscores removed, and

    a single underscore inserted in front of the class name. For example,

    the identifier __spam occurring in a class named Ham will be

    transformed to _Ham__spam. This transformation is independent of the

    syntactical context in which the identifier is used. If the

    transformed name is extremely long (longer than 255 characters),

    implementation defined truncation may happen. If the class name

    consists only of underscores, no transformation is done.

    在定义类之后,您正在分配您的属性

    到文档的链接已断开

    展开全文
  • python双下划线含义、MethodType把函数变为方法以及类继承
    不多说,直接给出学习代码记录
    # python对属性 权限的控制是通过属性名来实现的
    # 如果一个属性由双下划线开头(__),则该属性就无法被外部访问
    # 例1. 双下划线开头的属性不能直接被外部访问
    class Person(object):  # 继承object类得到新式类
        def __init__(self, name):
            self.name = name
            self._sex = 'M'
            self.__age = 20
    p = Person('Alice')
    print(p.name)
    print(p._sex)
    # print(p.__age)  # 这个地方会报错,告诉你该属性不存在
    print(p.__dict__)  # 可以看到其他属性都没变,但__age变成了_Person__age
    print(p._Person__age)  # 这样就可以访问到__age属性了
    
    # 如果一份属性以"__xx__"的形式定义,那么它又可以被外部访问了
    # 因为以"__xx__"定义的属性在python中称为特殊属性,有很多预定义的特殊属性可以使用
    #以单下划线开头的属性虽然也可以被外部访问,但按照习惯不应该这么做
    
    #利用types.MethodType()把一个函数变为一个方法
    import types
    def fn_get_grade(self):
        if self.score >= 80:
            return 'A'
        if self.score >= 60:
            return 'B'
        return 'C'
    
    class Person(object):
        def __init__(self, name, score):
            self.name = name
            self.score = score
    p1 = Person('Bob', 90)
    p1.get_grade = types.MethodType(fn_get_grade, p1)
    print(p1.get_grade())
    
    p2 = Person('Hansen', 75)
    # print(p2.get_grade())  # 会报错,告诉你 属性不存在
    
    # 和属性类似,方法也分实例方法和类方法
    class Person(object):
        count = 0
        @classmethod  # 通过该标记,方法将绑定到类上,而非类的实例,通常将参数名命名为cls
        def how_many(cls):
            return cls.count
    
        @property  # 像访问属性一样调用方法
        def getName(self):
            return self.name
    
        def __init__(self, name):
            self.name = name
    Person.count = Person.count + 1
    print(Person.how_many())
    p1 = Person('Tim')
    print(Person.how_many())
    print(p1.getName)
    # 因为是在类上调用,而非实例上调用,因此类方法无法获得任何实例变量,只能获得类引用
    
    # 类的继承
    # 多态:同一方法会有不同的反馈和流程
    class Person(object):
        def __init__(self, name, gender):
            self.name = name
            self.gender = gender
    class Student(Person):
        def __init__(self, name, gender, score):
            super(Student, self).__init__(name, gender)  # 继承Person的name和gender
            self.score = score
    class Teacher(Person):
        def __init__(self, name, gender, course):
            super(Teacher, self).__init__(name,gender)
            self.course = course
    p = Person('Bob', 'Male')
    s = Student('Alice', 'Female', 90)
    t = Teacher('David', 'Male', 'Math')
    isinstance(p, Person)  # 判断p的类型
    isinstance(s, Person) 
    dir(s)  # 获取变量的所有属性
    getattr(s, 'name')  # 获得name属性, 若属性不存在则报错
    getattr(s, 'name', 'Bob')  # 获得name属性, 若属性不存在则返回默认值'Bob'
    setattr(s, 'name', 'Hansen')
    
    # 比较运算符
    # __cmp__(self, other)
    # __eq__(self, other)
    # __lt__(self, other)
    # __gt__(self, other)
    
    # 数字运算符
    # __add__(self, other)
    # __sub__(self, other)  # 减
    # __mul__(self, other)
    # __div__(self, other)  # 除
    
    # 逻辑运算符
    # __or__(self, other)
    # __and__(self, other)
    
    # 转为字符串
    # __str__
    # __repr__
    # __unicode__
    

    展开全文
  • 在 前导双下划线(没有尾随的双下划线)表示不同的含义。在方法名或其他属性中,这意味着名称应该是“混乱的”,这样子类或超类在打算定义和使用自己的私有名称时更难意外地调用或重写它。在通常,这是一个很好的匹配...
  • Python中最常见的是类中的带有下滑线的函数是 __init__()最开始只是知道 有初始化的作用,这里从原理上总结一下。在Python中,由这些名字组成的集合所包含的方法称为特殊方法。如果对象实现了这些方法中的某一个,...
  • 双下划线开头和结尾Python中存在一些特殊的方法,有些方法以双下划线 “__” 开头和结尾,它们是Python的魔法函数,比如__init__()和__str__等等。不用要这种方式命名自己的变量或者函数。classA:def __init__(self,...
  • Python语言学习之双下划线那些事:python和双下划线使用方法之详细攻略 目录 双下划线介绍 1、关于双下划线函数或方法或属性 双下划线介绍 1、关于双下划线函数或方法或属性 __name__:...
  • Python 中以双下划线开头跟结尾方法称为 magic method 即 魔法方法,我之前总结过一些常用的给你参考:__new__ && __init__他们之间的关系是面试中经常会出现的问题。__new__ 跟 __init__ 的分工很明确: __...
  • 加下划线的函数会自动运行 Python中所有的类成员(包括数据成员)都是 公共的 ,所有的方法...若变量名称为双下划线前缀,则为私有变量.如 __private,可以只在类 或 函数中使用,有效. __init__在类中被用做构造函数.
  • Python下划线---完全解读Python下划线作为变量前缀和后缀指定特殊变量_xxx 不能用’from module import *’导入__xxx__ 系统定义名字__xxx 类中的私有变量名核心风格避免用下划线作为变量名的开始。因为下划线...
  • foo:一种约定,Python内部的名字,用来区别其他用户自定义的命名,以防冲突. ...首先是单下划线开头,这个被常用于模块中,在一个模块中以单下划线开头的变量和函数被默认当作内部函数,如果使用 from a_m...
  • Python中单下划线(_)和双下划线(__)的特殊用法函数使用单下划线_开头使用单下划线(_)开头的函数_func不能被模块外部以: from module import *形式导入。但可以用:from module import...类属性和类方法使用双下划线_...
  • Python下划线---完全解读Python下划线作为变量前缀和后缀指定特殊变量_xxx 不能用’from module import *’导入__xxx__ 系统定义名字__xxx 类中的私有变量名核心风格:避免用下划线作为变量名的开始。...
  • _ _new _ _(cls[,...]) _ _ new _ _()才是一个对象实例化时调用的第一个方法,它和其他的双下划线包围的方法不同,它的第一个参数不是sel而是这个类(cls),而其他的参数会直接传递给 _ _ init() _ _ 方法的。...
  • 在我看到上面的文章之前,我一直以为Python中这些下划线的作用就像Golang中方法/函数的大小写一样,或是一些其他语言中的 private 、 public 的作用一样,但仔细深究,这不全是Python这样设计的初衷。下面我们具体...
  • 属性”的方式操作操作类属性,除了使用 property() 函数Python 还提供了 @property 装饰器。通过 @property 装饰器,可以直接通过方法名来访问方法,不需要在方法名后添加一对“()”小括号。 @property装饰器,...
  • Python中最常见的是类中的带有下滑线的函数是 __init__()最开始只是知道 有初始化的作用,这里从原理上总结一下。  在Python中,由这些名字组成的集合所包含的方法称为特殊方法。如果对象实现了这些方法中的某一...
  • python中那些双下划线开头得函数和变量--转载Python中下划线---完全解读Python用下划线作为变量前缀和后缀指定特殊变量_xxx 不能用’from module import *’导入__xxx__ 系统定义名字__xxx 类中的私有变量名核心风格...
  • 1.写在前面今天遇到了__slots__,,所以我就想了解下python中那些双下划线开头的那些函数都是干啥用用的,翻到了下面这篇博客,看着很全面,我只了解其中的一部分,还不敢乱下定义。其实如果足够了解一些知识,知道...
  • python中那些双下划线开头的函数和变量

    千次阅读 多人点赞 2019-04-03 10:40:02
    天下苦秦久矣。 看别人的源码总是被各种下划线带晕了,总算偶得妙文,开疑解惑。 原文预估成文于2015之前,作者...Python下划线作为变量前缀和后缀指定特殊变量 _xxx 不能用’from module import *’导入 _...
  • 1.写在前面今天遇到了slots,,所以我就想了解下python中那些双下划线开头的那些函数都是干啥用用的,翻到了下面这篇博客,看着很全面,我只了解其中的一部分,还不敢乱下定义。其实如果足够了解一些知识,知道自己想...
  • 今天遇到了__slots__,,所以我就想了解下python中那些双下划线开头的那些函数都是干啥用用的,翻到了下面这篇博客,看着很全面,我只了解其中的一部分,还不敢乱下定义。 其实如果足够了解一些知识,知道自己想要...
  • 学习python的时候,我们经常碰到一些变量的变量名带单下划线/双下划线前缀或者后缀,然后会觉得这样的命名风格很奇怪。除了变量命名风格外,也会遇到下划线的表达式,也会让人摸不着头脑。今天我们就来看下,python...
  • 学习python的时候,我们经常碰到一些变量的变量名带单下划线/双下划线前缀或者后缀,然后会觉得这样的命名风格很奇怪。除了变量命名风格外,也会遇到下划线的表达式,也会让人摸不着头脑。今天我们就来看下,python...
  • 单下划线与双下划线python 中,会看到 _xx, xx 以及 __xx 这样的变量或者函数名,在这里做一个简要的总结。 _xx:保护(protected)变量或函数,意思是只有类对象和子类对象能够访问到这些变量,不能用 ‘from ...
  • 模式 举例 含义 单前导下划线 _var 命名约定,仅供内部使用。... 前导下划线 __var 类上下文中触发“名称修饰”。由python解释器强制执行。 前导和双后导下划线 __...
  • 函数使用单下划线_开头使用单下划线(_)开头的函数_func不能被模块外部以: from module import *形式导入。...类属性和类方法使用双下划线__开头__开头为私有类型属性和方法,仅允许类内部访问,类...

空空如也

空空如也

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

python双下划线函数

python 订阅