美文网首页呆鸟的Python数据分析
python进阶-特殊变量和属性

python进阶-特殊变量和属性

作者: Liburro | 来源:发表于2018-07-25 12:36 被阅读37次

    本文主要记录了python中一些特殊变量或者属性的说明,比如__all__等。

    __all__

    先看代码,假设有两个py文件,

    test.py

    import re
    
    def f():
        print('test:f')
    
    def f1():
        print('test:f1')
    

    test1.py

    from test import *
    
    f()
    f1()
    print(re.findall('\d', '123'))
    

    运行test1.py是不会报错的,但是我们看见我们用了re模块,test1.py里面却没有使用import re引入,为什么呢,因为我们在import test的时候,test.py里面引入了re,所以我们在这里也可以使用。另外,如果我在test.py里面定义的某些内容,不想其它模块使用,比如这里f1这个函数,我只想别人用我的f函数,f1不能使用,那么__all__变量就可以解决这个问题。

    当我们修改test.py为如下格式后:

    import re
    
    __all__ = [
        'f'
    ]
    
    def f():
        print('test:f')
    
    def f1():
        print('test:f1')
    

    test1.py就只能使用f函数了,ref1都是不能使用的。

    注意:__all__只针对import *这种格式有效,如果要访问f1或者re,其它模块仍然可以使用test.f1或者test.re这种限定访问符的方式来访问。

    __name__

    The name of the class, function, method, descriptor, or generator instance.

    __main__

    如果模块在被直接执行的时候__name__就等于__main__,如果是被导入__name__就等于模块的文件名

    __dict__

    A dictionary or other mapping object used to store an object’s (writable) attributes.

    就是一个字典,存储了对应对象的属性。

    __slots__

    它是一个列表,是一个类属性,如果设置了这个属性,那么__dict__就无效了,只有定义在__slots__列表里面的属性才可以进行获取或者配置,使用这个属性,我们可以防止用户随意产生属性,比如:

    class A(object):
        def __init__(self):
            self.a = 1
    

    上面没有使用__slots__,那么用户可以做下面的操作:

    x = A()
    x.a = 2
    x.b = 1 #这个是用户自己加入的
    

    如果类的定义增加了__slots__,我们可以防止用户访问或者设置不应该有的属性:

    class A(object):
        __slots__ = ['a']
        def __init__(self):
            self.a = 1
    

    那么用户在用x.b = 1的时候会抛出异常AttributeError: 'A' object has no attribute 'b'

    注意:这个属性,只是针对类的实例有效,如果直接对类设置了一个不在__slots__里面的属性,这个属性可以设置成功,而且类的实例也可以访问,比如:

    class A(object):
        __slots__ = ['a']
        def __init__(self):
            self.a = 1
    
    A.b = 2
    x = A()
    print(x.b)
    

    我们虽然限定了__slots__ = ['a'],但是我们对A.b = 2,那么下面的print仍然可以打印出结果,而且不会报错。

    相关文章

      网友评论

        本文标题:python进阶-特殊变量和属性

        本文链接:https://www.haomeiwen.com/subject/zilemftx.html