实例方法、类方法、静态方法、私有方法详解

本贴最后更新于 1022 天前,其中的信息可能已经水流花落

前言:在上vip课的时候,每次讲到实例方法、类方法、静态方法、私有方法的时候,很多同学而虽然上课能听懂,但是在实践的时候还是不能灵活使用。今天我们就来聊一聊这些方法到底有哪些特点,应该怎么使用。

一、实例方法
  1. 实例方法的定义
    class TestDemo:
        #实例方法定义在类中
        def test_01(self):
            print("test_01是实例方法,定义在类中")
    
  2. 实例方法的调用
    class TestDemo:
        #实例方法定义在类中
        def test_01(self):
            print("test_01是实例方法,定义在类中.")
    
        def test_02(self):
            self.test_01() #在类里面调用:self.方法名()  self:类实例
    
    if __name__ == '__main__':
        cl = TestDemo()
        cl.test_02() #在类外面调用: 类实例.方法名()
    
    输出
    test_01是实例方法,定义在类中.
    
  3. 总结
    1第一个参数必须是实例对象】,该参数名一般约定为"self"
    2通过它来传递实例的属性和方法也可以传类的属性和方法只能由实例对象调用
    3类内部self.函数名称()
    4类外部类名称().函数名称()
    5使用场景方法内部如果要使用实例属性或实例方法就定义为实例方法
    
二、类方法
  1. 类方法的定义
    class TestDemo:
        @classmethod
        def test_01(cls):
            print("test_01是类方法,通过@classmethod修饰.")
    
  2. 类方法的调用
    class TestDemo:
        def __init__(self):
            self.name = "刘德华"
            self.age = 58
    
        @classmethod
        def test_01(cls):
            print("test_01是类方法,通过@classmethod修饰.")
            #print(cls.name) # 不能使用类实例属性
            #cls.test_03()   # 不能使用实例方法
    
        @classmethod
        def test_02(cls):
            print("test_02是类方法,通过@classmethod修饰.")
            TestDemo.test_01() # 在类内部类方法中调用,类.类方法名称()
    
        def test_03(self):
            self.test_02() # 在类内部实例方法中调用, self.类方法名称()
    
    if __name__ == '__main__':
        TestDemo.test_02() # 在类外部调用,类.类方法名称()
        TestDemo().test_02() # 在类外部调用,类实例.类方法名称()
    
  3. 总结
    1使用装饰器@classmethod
    2第一个参数必须是当前类本身】,该参数名一般约定为"cls"
    3类方法可以被+类实例调用
    4类内部self.方法名称().方法名称()
    5类外部.方法名称()类实例.方法名称()
    6不可以使用实例属性】、【实例方法
    7使用场景方法内部不需要使用实例属性和实例方法适合定义类方法
    
三、静态方法
  1. 静态方法的定义
    class TestDemo:
        @staticmethod
        def test_04():
            print("test_04是静态方法,通过@staticmethod修饰")
    
  2. 静态方法的调用
    class TestDemo:
        city = "香港"
        def __init__(self):
            self.name = "刘德华"
            self.age = 58
    
        @classmethod
        def test_01(cls):
            print("test_01是类方法,通过@classmethod修饰.")
    
        @classmethod
        def test_02(cls):
            print("类方法中调用静态方法")
            TestDemo.test_04() # 类.方法名称()
    
        def test_03(self):
            print("实例方法中调用静态方法")
            self.test_04() # self.方法名称()
    
        @staticmethod
        def test_04():
            print("test_04是静态方法,通过@staticmethod修饰")
            # self.test_03() # 不能使用实例方法
            # print(self.name) # 不能使用实例属性
            # print(cls.city) #不能使用类属性,可以这样使用TestDemo.city
            # cls.test_02() # 不能使用类方法,可以这样使用TestDemo.test_02()
    
        @staticmethod
        def test_05():
            print("静态方法中调用静态方法")
            TestDemo.test_04() # 类.方法名称()
    
    if __name__ == '__main__':
        TestDemo.test_05() # 静态方法中调用静态方法,类外部调用静态方法
        TestDemo.test_02() # 类方法中调用静态方法
        TestDemo().test_03() # 实例方法中调用静态方法
    输出
    静态方法中调用静态方法
    test_04是静态方法通过@staticmethod修饰
    类方法中调用静态方法
    test_04是静态方法通过@staticmethod修饰
    实例方法中调用静态方法
    test_04是静态方法通过@staticmethod修饰
    
  3. 总结
    1使用装饰器@staticmethod
    2没有"self""cls"参数
    3方法体中不能使用类和实例的任何属性和方法(指通过self,cls调用)
    3调用类和实例对象都可以调用
    

四、私有方法

  1. 私有方法的定义
    class TestDemo:
        def __adds(self,*args):
            print('__adds是私有方法')
            return sum(*args)
    
  2. 私有方法的调用
    class TestDemo:
        def __adds(self,*args):
            print('__adds是私有方法')
            return sum(*args)
    
        def test_01(self,*args):
            result = self.__adds(args) # 类内部调用私有方法,self.方法名称()
            return result
    if __name__ == '__main__':
        cl = TestDemo()
        cl.test_01(1,2,3) #类外部调用实例方法,实例方法在类里面访问私有方法
        #cl.__adds(1,2,3) #类外部无法直接访问私有方法
        print(TestDemo.__dict__) #类属性中找到私有方法对应的属性名称
        TestDemo._TestDemo__adds(cl,[1,2,3])# 通过私有属性名称强行访问,不建议这么操作
    输出
    __adds是私有方法
    {'__module__': '__main__', '_TestDemo__adds': <function TestDemo.__adds at 0x000001F8A2637288>, 'test_01': <function TestDemo.test_01 at 0x000001F8A26374C8>, '__dict__': <attribute '__dict__' of 'TestDemo' objects>, '__weakref__': <attribute '__weakref__' of 'TestDemo' objects>, '__doc__': None}
    __adds是私有方法
    
  3. 总结
    1私有方法在类中通过__(双下划线开头)定义
    2私有方法属于类中其他方法的辅助方法一般不在类外部进行访问只在类内部使用
    3私有方法可以强行访问但是不建议强行访问
    
13 回帖
请输入回帖内容 ...