函数装饰器@
#funA 作为装饰器函数
def funA(fn):
#...
fn() # 执行传入的fn参数
#...
return '...'
@funA
def funB():
#...
等价于
def funA(fn):
#...
fn() # 执行传入的fn参数
#...
return '...'
def funB():
#...
funB = funA(funB)
总结:这一句@,相当于在定义了funA和funB后,执行了funB=funA(funB)
几种python内置的函数装饰器
@staticmethod,@classmethod和@property
python的@staticmethod,@classmethod和@property的使用和区别
- 这三个都是装饰类里面的方法的
- 如果用了@staticmethod 静态方法,@classmethod类方法, 则类不用实例化就可以调用。没用他俩的方法叫实例方法。二者区别是:
- @staticmethod: 静态方法, 不需要表示自身对象的self和自身类的cls参数,就和使用普通的函数一样。
- @classmethod 类方法:不需要self参数,但是第一个参数需要表示自身类的cls参数。cls和self详见下文
- @property:加了这个,调用的时候就不用加括号()了。
问题
什么是cls参数和self参数
什么是__init__, 之类的
python类:
定义类
class ClassNAme:
attribute1 = 1
attribute2 = 2
def method1(self):
print("method1")
def method2(self):
print("method2")
构造方法__init__(self,…):
每创建一个对象时会调用。
如果不手动为类添加任何构造方法,Python 也会自动为类添加一个仅包含 self 参数的构造方法。
仅包含 self 参数的 init() 构造方法,又称为类的默认构造方法。
实例对象
myObject = ClassNAme(参数)
self
self类似于C++的this,表示这个对象自己的引用。
cls
说到self就不得不提cls.
self是对象的引用,用到self就等价于用到这个对象名本身。
cls是类的引用,用到cls就等价于用到这个类本身。
举个例子:
下面这里,staticmethod没有self也没有cls,所以他里面完全不能调用实例方法foo2。
但classmethod可以通过cls,用cls()实例化一个对象,从而调用实例方法foo2
class A(object):
a = 'a'
@staticmethod
def foo1(name):
print 'hello', name
print A.a # 正常
print A.foo2('mamq') # 报错: unbound method foo2() must be called with A instance as first argument (got str instance instead)
def foo2(self, name):
print 'hello', name
@classmethod
def foo3(cls, name):
print 'hello', name
print A.a
print cls().foo2(name)
作者:秦风
链接:https://www.zhihu.com/question/49660420/answer/335991541
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
类的特殊成员
- Python 类中,凡是以双下划线 “__” 开头和结尾命名的成员(属性和方法),都被称为类的特殊成员(特殊属性和特殊方法)。
- 例如,类的 init(self) 构造方法就是典型的特殊方法。
- Python 类中的特殊成员,其特殊性类似 C++ 类的 private 私有成员,即不能在类的外部直接调用,但允许借助类中的普通方法调用甚至修改它们。
- 如果需要,还可以对类的特殊方法进行重写,从而实现一些特殊的功能。
__init__()
详见上文
myObject = ClassName() 的时候回调用。
__new__()
__new__()在init之前调用。
暂时还不知道有什么用。
__repr__()方法:显示属性
通过重写类的__repr__() 方法,自定义输出实例化对象时的信息。
这样每次print(对象)的时候,就会输出__repr__方法return的东西。
print(对象)的时候调用。
__del__()方法:销毁对象
- 无论是手动销毁,还是 Python 自动帮我们销毁,都会调用 del() 方法。
- 手动销毁的方法是
del 对象名
- 当程序中有其它变量(比如这里的 cl)引用该实例对象时,即便手动调用 __del__() 方法,该方法也不会立即执行。这和 Python 的垃圾回收机制的实现有关。
- 如果我们重写子类的\ _del_() 方法(父类为非 object 的类),则必须显式调用父类的 __del__() 方法
- 就是说销毁的时候会调用,但无法人为保证销毁。
__dir__()方法:列出对象的所有属性(方法)名 (只有名,没有值)
该函数会返回一个包含有所有属性名和方法名的有序列表(包括父类的)。
用法: dir(myObject) 或 myObject.__dir__()
__dict__属性:属性字典
myObject.__dict__
__version__属性:版本
torch.__versjion__
继承:父类和子类
子类继承父类时,只需在定义子类时,将父类(可以是多个)放在子类之后的圆括号里即可。语法格式如下:
class 类名(父类1, 父类2, …):
#类定义部分