zoukankan      html  css  js  c++  java
  • python中的定义类方法有三种形式

    • 普通方法

    • 类方法(@classmethod)

    • 静态方法(@staticmethod)

    普通方法

    创建普通的方法的方式有两种(class A() & class B()).

    class A():
        def __init__(self, name, age):
            self.name = name
            self.age = age
     
        def get_name(self):
            print('my name is', self.name)
     
        def get_age(self):
            print(f'i am {self.age} years old')
     
    class B():
        def get_name(self, name):
            print('my name is', name)
     
        def get_age(self, age):
            print(f'i am {age} years old')
     
    if __name__ == '__main__':
        a = A('tom',19)
        a.get_name()  # my name is tom
        a.get_age() # i am 19 years old
     
        b = B()
        b.get_name('tom')  # my name is tom
        b.get_age(19) # i am 19 years old
    

    class A() 中, __init__()是一个特殊的方法,相当于对A进行初始化,__init__ 中的self是对象A本身,name和age是它们的形参。

      每次调用方法之前需要对类进行实例化

    类方法

    @classmethod不需要self来表示自身了,而是用了cls来代替。

    此时不用再进行实例化了。直接 类名.函数名 进行调用。

    #Python学习交流群:725638078
    class C():
        @classmethod
        def get_name(cls, name):
            print(cls)  # <class '__main__.C'>
            print('my name is %s' % name)
     
        @classmethod
        def get_age(cls, age):
            print(f'i am %s years old' % age)
     
    if __name__ == '__main__':
        C.get_name('tom')  # my name is tom
        C.get_age(19) # i am 19 years old
    

    静态方法

    @staticmethod也是通过 类名.函数名 的方式进行调用

    静态方法不需要表示自身对象的self或者cls作为参数,跟直接使用函数是一样的。

    class D():
        @staticmethod
        def get_name(name):
            print('my name is %s' % name)
     
        @staticmethod
        def get_age(age):
            print(f'i am %s years old' % age)
     
    if __name__ == '__main__':
        D.get_name('tom')  # my name is tom
        D.get_age(19) # i am 19 years old
    

    总结

    @staticmethod 与 @classmethod在Python中称为 装饰器,

    用来修饰函数,相当于添加一个额外的功能,比如不再像普通函数那样进行实例化。

    通过使用装饰器可以让代码更加整洁,易读。用了修饰器之后,也可以进行实例化之后再调用,但是就显得多此一举了。

  • 相关阅读:
    关于c++中 get 和getline
    使用参数初始化表来实现对数据成员的初始化
    关于c++中运算符重载
    关于c++的友元函数
    C#控制台程序点击后暂停工作
    hhgame
    记字符编码与转义符的纠缠
    如何向非技术人(程序猿)解释SQL注入?
    记VS2013并行编译导致出错的解决过程
    记32位Oracle客户端登录报12560协议适配器错误的解决办法
  • 原文地址:https://www.cnblogs.com/python960410445/p/15593643.html
Copyright © 2011-2022 走看看