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,..)
类里面执行函数 如 self.xx() 则不需要传 self,参数,默认当前self 会自动传入到第一个参数
实例调用也一样,如果不想被传入当前实例,则需要使用 @staticmethod 来装饰,这样就不会传入当前实例了。如果用@classmethod 装饰,则会传入实例对应的类 今天终于明白了,self 代表实例,不用装饰器,默认为实例方法,只有用staticmethod 装饰,才可以不穿参数,否则要传一个参数,作为实例或者类的占位符,否则这个函数就是个砖头,类和实例都吊用不了的(当然,不调用你放哪里,也没啥影响)
def xx(self):
pass
当你在类里面执行东西的时候,必须通过self. 来调用当前实例所能找到的东西 而不是 xx(self), 因为当前实例函数 c 里面找不到 而应该在实例 self 里面找 b
这种也是错的,要想在初始化运行一个函数,只能 定义一个砖头函数,在里面写很多东西,然后在类里面顶格运行。林外 砖头函数 实例和类都无法调用, 初始化还是交给 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. 也是为了找到函数
函数位置参数的问题
下图可以看出,位置参数可以使用 关键字的形式,传递,这样就可以不用写位置对应了,相反,如果省略形参名字,那么就默认形参和当前位置一一对应