python 面向对象,类和对象。函数装饰器 和 类的特殊属性和方法

参考链接

函数装饰器@

#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, …):
#类定义部分

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值