zoukankan      html  css  js  c++  java
  • python3中类里面静态方法(@staticmethod),类方法(@classmethod)和实例方法(self)的使用与区别

    前言

    python3 类里面常用的方法有3个:静态方法(@staticmethod),类方法(@classmethod)和实例方法(self)

    本篇讲解这3种方法在使用上有什么区别。

    函数

    先从函数说起,方法跟函数是有区别的,经常有人容易混淆,函数定义是def关键字定义(外面没有class)

    def fun():
        xx="hehe"
        return xx
    a=fun()
    print(a)
    

     函数调用使用函数名称后面加括号就能调用了  

    实例方法(self)

    类里面的方法定义也是用def关键字,注意在类里面叫方法了,不叫函数,定义的方法默认在括号里面加一个self参数。

    self是类本身的实例对象,所以在看到def定义的方法括号后面有self参数的叫实例方法。

    class He:
        def fun(self):
            print("He的:{}".format(id(He)))
            print(id(self))
            b='xi'
            return b
    a=He()
    print(id(a))
    a.fun()
    # He.fun() # 报错 fun() missing 1 required positional argument: 'self'
    

     fun()里面带了self参数,那么它是实例方法,也就是He()实例对象的方法了,所以必须先实例化He()才能调用此方法。

    静态方法(@staticmethod)

    我们可以在函数里面写一个类

    def fun():
        a = "hello"
        class A(object):
            count = 0
    
            def fun(self):
                b = "world"
                return b
        return A
    x=fun()
    y=x().fun()
    print(y)
    

     于是会想到,在类里面是不是也可以写一个函数呢?于是就有了静态方法(@staticmethod),静态方法的出现就是为了在类里面可以写一个函数,当普通的函数去调用。

    定义静态方法需使用@staticmethod装饰器,并且括号后面不需要self参数了。 

    class He:
        count=0
        def fun(self):
            b="hello"
            return b
        @staticmethod
        def start():
            print("开始学习了---")
    He.start() #不用实例化,也能调用
    a=He() #实例化也能调用
    a.start()
    

     静态方法不需要实例化可以直接调用,实例化后也能调用,可以理解成函数。

     类方法(@classmethod)

    类里面有2个概念,属性和方法

    He类和He()实例对象的属性是不一样的,比如

    • He类只有count属性
    • He()实例对象的属性是__init__里面的age和name,并且包含He类的属性count
    class He:
        count=1
        def __init__(self):
            self.age=16
            self.name='xixi'
    print(He.count) #类只有count属性
    # print(He.age) #type object 'He' has no attribute 'age'
    a=He() #类实例,实例化对象
    print(a.count)
    print(a.age)
    print(a.name)
    

     既然已经知道了He类的属性和He() 实例对象属性是不一样的,再回到前面的实例方法概念上,实例方法是He() 实例对象的方法。

    既然He()实例对象有实例方法,那么He类当然也有类方法的概念了,于是可以在方法上加上@classmethod装饰器声明它是类方法,并且括号第一个参数cls是指类本身

    class He:
        count=1
        def fun(self):
            b="xixi"
            return b
        @staticmethod
        def start():
            print("开始了")
        @classmethod
        def begin(cls):
            print("begin--")
    He.begin() #不需要实例化,类名称直接调用类方法
    a=He() #实例化也能调用类方法
    a.begin()
    

     

     

    越努力,越幸运!!! good good study,day day up!!!
  • 相关阅读:
    day09页面的声明周期函数
    day8小程序的运行环境与基本架构
    day09小程序复习
    day08前后端交互
    day07获取图片
    day07获取用户地址信息
    MySQL 主从同步延迟的原因及解决办法
    升级Oracle 19c经验: TTS 在使用datapump导matadata时EXCLUDE=STATISTICS 不启作用
    12c,19c自动kill长时间未活动会话特性
    SuSE11单实例二进制安装MySQL5.7
  • 原文地址:https://www.cnblogs.com/canglongdao/p/15135329.html
Copyright © 2011-2022 走看看