21李刚python第五章

#新增的方法,默认不会自动绑定self参数
#换言之,self参数必须程序员来传入参数值
im.bar = fn(im)
def fn (sefl):
print(“新增的方法”)
#将fn包装成方法,且im自动绑定第一个参数
import types
im.bar = types.MethodType(fn,im)
#为属性赋值,但所赋的值是方法,该属性变量就变成方法
#----方法中的self总是代表该方法的调用者
#一个方法调用其他方法,也需要使用self来调用
#把self参数作为返回值,则可多次连续调用方法(只要方法也返回self)
class Role:
def test(sefl):
print(‘test方法’)
#test方法本身是实例方法应该用对象调用,但python允许使用类调用实例方法,此时就变成了“未绑定的方法”,因此必须显示为self参数传入参数值
r = Role()
Role.test®

class Tiger:
#类方法两点:1、用@classmethod修饰2、定义一个cls形参
@classmethod
def info (cls):
print(‘info类方法’)
print(cls)
peint(Tiger)
#类方法属于类本身,因此用类来调用
#类方法第一个cls参数也会自动绑定,绑定到调用该方法的类
Tiger.info()
t = Tiger()
#对象调用类方法,实际上相当于用类调用类方法,同样也会执行自动绑定
#第一个参数绑定当前类
t.info()

#静态方法相当于一个函数,因此不会自动绑定
#类调用静态方法,因此必须为参数传入函数值
#对象调用静态方法,也不会自动绑定,因此必须为参数传入参数值

‘’’ 实例方法 类方法 静态方法
对象调用 自动绑定 自动绑定 不自动绑定
类调用 不自动绑定 自动绑定 不自动绑定
‘’’

#foo函数,该函数将打算作为函数装饰器使用
#作为函数装饰器使用的函数,它必须定义一个形参
def foo(fn):
print(‘foo函数’)
print(fn)
return ‘fkjava’
#被装饰的函数
@foo
def bar():
print(‘bar函数’)
‘’’
函数装饰器的本质:
(1)将被装饰的函数bar()作为参数传给装饰器函数foo()
(2)被装饰的函数(bar)将被替换成装饰器函数(foo)返回值
‘’’
print(bar) # bar将被装饰——替换成装饰器函数(foo)的返回值
#由于bar其实已经被替换成了fkjava,因此bar函数不能被调用
bar()

#foo函数,该函数将打算作为函数装饰器使用
#作为函数装饰器使用的函数,它必须定义一个形参
def foo(fn):
print(‘foo装饰器函数’)
# fn就代表了被装饰的函数:test
def noname(*args):
print(’-----模拟在目标函数之前植入的advice
-----’)
fn(*args)#目标函数依然在次处调用
print(’-----模拟在目标函数之后植入的advice
-----’)
return noname
@foo
def test (a,b):
print(‘bar函数’)
print(‘参数a:’,a)
print(‘参数b:’,b)
#表面上是调用test函数,实际上是调用foo装饰器函数的返回值(noname)
test(2,4)

#类空间中定义的变量,是类变量
#通过self引用赋值的变量,是实例变量
#通过类引用赋值的变量,是类变量
#当对象本身没有实例变量时,对象可访问该类变量
#只要通过对象对变量赋值,就变成了新增实例变量

#python会修改_开头的成员名,会将它们的名字增加_类名
im = Item()
print(im._Item__name)

#如果希望调用父类的方法,可通过未绑定方法来调用
#类名调用方法,未绑定方法,因此需要显式传入第一个参数

#当子类的初始化操作与父类初始化操作相同时
#程序不应该直接复制父类初始化代码—这样不利于后期的项目升级
#因此,子类构造器应该直接调用父类的构造方法
#方式一:使用未绑定方法调用父类构造方法:需要显示传入self参数
#方式二:使用super()函数调用父类方法,不需要显示传入self参数

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值