美文网首页
python 的一些小的知识点 hasattr getat

python 的一些小的知识点 hasattr getat

作者: 天空蓝雨 | 来源:发表于2019-12-06 19:53 被阅读0次

    https://docs.python.org/3/

    python 最新官方文档

    hasattr 、getattr 、setattr 是python内置的三个读写对象属性(包含函数名属性),没有调用者,独立函数 ,第一个参数都是对象本身。

    对象有属性则返回True object -- 对象。name -- 字符串,属性名。

    hasattr(object, name)

    用于读取对象属性值,该属性不存在,则添加

    getattr(object, name[, default])

    object -- 对象。name -- 字符串,对象属性。default -- 默认返回值,如果不提供该参数,在没有对应属性时,将触发 AttributeError。

    值的注意的一点,装饰器 @property 是封装了getattr 函数,实现了,函数可以像属性一样调用,

    此时,@property本身又创建了另一个装饰器@funcname.setter,负责把一个setter方法变成属性赋值

    @funcname.deleter 是删除属性, del 这个函数名,会触发 deleter 装饰的函数 因为这三个属性的函数名是一样的。有点多态的意思

    @property       @xxfunc.setter                @xxfunc.deleter 
        xxfunc()         xxfunc(value)                xxfunc()
    

    设置对象属性值

    setattr(object, name, value)

    object -- 对象。name -- 字符串,对象属性。value -- 属性值。

    !/usr/bin/env python3 # 指定默认解释器 作为 ./my_script.py 执行时搜索解释器的路径,不写则需要python2/3 my_script.py 来执行.py 命令行优先级比文贱内指定更优先

    然后用命令行直接调用文件 -- ./my_script.py, shell 会检查脚本的第一行代码, 发现有 shebang, 会按其指定的解释器来执行;

    用命令行执行脚本时, 指定解释器: python3 ./my_script.py;

    也可以在脚本内, 通过 shebang 指定解释器. 比如想让 Python3 解释器来执行脚本, 那么, 在 Python 脚本的第一行写上 #!/usr/bin/python3 或者是

    --coding: utf-8 -- python2 必须写

    class a():
    
        def __init__(self,a):
    
            self.a = a
    
            print(b)
    
            raise TypeError
    
        c = 3
    
        print(c)
    
        b = 2
    
        def c():
    
            print("Fe")
    
        c()
    
    a("2")
    
    >> 3
    
        Fe
    
        2
    

    总结 类里面 是 把所有东西都读一遍,然后在执行 init() 并不是直接一下就执行的

    相当于 类的下级缩进 都会像是 文件顶格一样,并且最后一行顶格执行 init(self,..)

    例子 可以看出最后执行 init

    类里面执行函数 如 self.xx() 则不需要传 self,参数,默认当前self 会自动传入到第一个参数

    实例调用也一样,如果不想被传入当前实例,则需要使用 @staticmethod 来装饰,这样就不会传入当前实例了。如果用@classmethod 装饰,则会传入实例对应的类 今天终于明白了,self 代表实例,不用装饰器,默认为实例方法,只有用staticmethod 装饰,才可以不穿参数,否则要传一个参数,作为实例或者类的占位符,否则这个函数就是个砖头,类和实例都吊用不了的(当然,不调用你放哪里,也没啥影响)

    def xx(self):
    
        pass
    
    image

    当你在类里面执行东西的时候,必须通过self. 来调用当前实例所能找到的东西 而不是 xx(self), 因为当前实例函数 c 里面找不到 而应该在实例 self 里面找 b

    image

    这种也是错的,要想在初始化运行一个函数,只能 定义一个砖头函数,在里面写很多东西,然后在类里面顶格运行。林外 砖头函数 实例和类都无法调用, 初始化还是交给 init 把,另外 类里面定义的非砖头函数 都不能直接顶格运行在 类里面

    实例外绑定的函数,不会自动传入实例作为第一个参数

    关于动态绑定函数属性,参考

    https://blog.csdn.net/icelamp/article/details/8903298

    只有砖头 才可以顶格运行,但是好像也没多大意义

    python class 里面的slots = () 字符串元祖

    作用是限制实例所能绑定的属性,(当然包括初始化以及在外面动态加入的)。不会限制类的属性

    也不会限制函数属性

    不会继承,除非子类 也定义 这个变量,那么才会继承 合并

    文件 读写 w 不存在新建 a 表示追加 + 表示可以读写(+ 代表另一种方式的意思)

    r 只读 只要带 r 不存在就会报错(r+ 不存在也会报错)

    x 新建文件 写 ,如已存在 则报错

    解决 linux 和window 的分隔符问题:
    os.sep window 就是 " \ " linux 就是 " / "

    今天 有有学到了一个小技巧,就是 在定义class 的时候,可以定义一个属性,如:

    self.OPEN_METH= {
    
    "tar": "taropen",# uncompressed tar
    
        "gz":  "gzopen",# gzip compressed tar
    
        "bz2": "bz2open",# bzip2 compressed tar
    
        "xz":  "xzopen"    # lzma compressed tar
    
    }
    

    然后调用的时候可以用 func = getattr(self,self.xx) 其中self.xx 是要调用函数的key 字符串

    然后使用 func(xx) func 已经是当前函数了。不需要 self.func() 了 ,使用self. 也是为了找到函数

    函数位置参数的问题

    下图可以看出,位置参数可以使用 关键字的形式,传递,这样就可以不用写位置对应了,相反,如果省略形参名字,那么就默认形参和当前位置一一对应

    image image

    相关文章

      网友评论

          本文标题:python 的一些小的知识点 hasattr getat

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