当前位置 > it书童 > 知识体系 > 正文

面向对象-方法

知识体系 it书童 2019-10-03 21:40:33 0赞 0踩 221阅读 0评论

类调用实例方法

默认情况下,类是不能调用实例方法的,因为第一个参数 self 无法自动绑定。除非手动为 self 参数传入实例,一般不会这么干,显得很多余

class User:
    def walk(self):
        print(self, '正在慢慢地走')


User.walk()
# TypeError: walk() missing 1 required positional argument: 'self'
class User:
    def walk(self):
        print(self, '正在慢慢地走')


# 显式为方法的第一个参数绑定参数值
u = User()
User.walk(u)  # <__main__.User object at 0x10e85d710> 正在慢慢地走
# 显式为方法的第一个参数绑定字符串参数值
User.walk('韦小宝')  # 韦小宝 正在慢慢地走

类有自己可调用的类方法与静态方法,没必要去瞎掺和实例方法

类方法与静态方法

类方法和静态方法的区别在于:Python 会自动绑定类方法的第一个参数,类方法的第一个参数(cls)会自动绑定到类本身;而静态文法不会自动绑定

使用 @classmethod 修饰的是类方法

使用 @staticmethod 修饰的是静态方法

class Bird:
    @classmethod
    def fly(cls):
        print('类方法 fly: ', cls)

    @staticmethod
    def info(p):
        print('静态方法 info: ', p)


# 调用类方法,Bird 类会自动绑定到第一个参数
Bird.fly()  # 类方法 fly:  <class '__main__.Bird'>

# 调用静态方法,不会自动绑定,需要手动绑定第一个参数
Bird.info('chick')  # 静态方法 info:  chick

# 使用对象调用,其实依然还是使用类调用
b = Bird()
b.fly()  # 类方法 fly:  <class '__main__.Bird'>
b.info('chick')  # 静态方法 info:  chick

函数装饰器

使用 @ 符号引用已有的函数,可用于修饰其他函数,这些用于装饰的函数即是函数装饰器,如 @staticmethos@classmethod,其中 staticmethodclassmethod 都是 Python 内置的函数

我们也可以自定义函数装饰器

def fun_a(fn):
    print('a')
    fn()
    return 'hello'


"""
下面的装饰器效果相当于 fun_a(fun_b)
fun_b 将会替换(装饰)成该语句的返回值
"""


@fun_a
def fun_b():
    print('b')


print(fun_b)
# a
# b
# hello

被装饰的函数总是被替换成 @ 符号所引用的函数的返回值,因此被修饰的函数会变成什么,完全由 @ 符号所引用的函数的返回值决定

转载须注明出处:https://www.itshutong.com/articles/10/object-oriented-method
关于我
一个文科出身的程序员,追求做个有趣的人,传播有价值的知识,微信公众号主要分享读书思考心得,不会有代码类文章,非程序员的同学请放心订阅
发表评论
我有句话,不知当讲不当讲?
要讲之前请先 登录