python 的一些小的知识点 hasattr getattr setattr

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 getattr setattr)