zoukankan      html  css  js  c++  java
  • 类的属性、方法、静态方法

    1.开篇引入

    class A:
        #类属性
        explantion = "this is my programs"
        #普通方法,或者实例方法
        def normaMethod(self,name):
            print(self.explantion)
    
        #类方法,可以访问类属性
        @classmethod
        def classMethod(cls,explanation):
            print(cls.explantion)
    
        #静态方法,不可以访问类属性
        @staticmethod
        def staticMethod(explanation):
            print(staticmethod)
    
    a = A()
    a.explantion = "this is new"
    print(a.normaMethod("explanation"))
    

     结果:

    C:Usersg1702543PycharmProjectsuntitledvenvScriptspython.exe "C:/Users/g1702543/PycharmProjects/untitled/Day12/普通 类 静态方法.py"
    this is new
    None

      首先形式上的区别,实例方法隐含的参数为类实例self,而类方法隐含的参数为类本身cls。 静态方法无隐含参数,主要为了类实例也可以直接调用静态方法。

      所以逻辑上,类方法被类调用,实例方法被实例调用,静态方法两者都能调用。主要区别在于参数传递上的区别,实例方法悄悄传递的是self引用作为参数,而类方法悄悄传递的是cls引用作为参数。

    2.类和实例是否调用类的属性

    class A:
        #类属性
        explantion = "this is my programs"
        #普通方法,或者实例方法
        def normaMethod(self,name):
            print(self.explantion)
    
        #类方法,可以访问类属性
        @classmethod
        def classMethod(cls,explanation):
            print(cls.explantion)
    
        #静态方法,不可以访问类属性
        @staticmethod
        def staticMethod(explanation):
            print(staticmethod)
    
    a = A()
    a.explantion = "this is new"
    print(a.normaMethod("explanation"))
    #print(A.normaMethod("explanation"))   ##error
    

     结果:实例方法(普通方法)由实例调用,类不能调用

     

    3.类方法是否可以类调用或者实例调用

    class A:
        #类属性
        explantion = "this is my programs"
        #普通方法,或者实例方法
        def normaMethod(self,name):
            print(self.explantion)
    
        #类方法,可以访问类属性
        @classmethod
        def classMethod(cls,explanation):
            print(cls.explantion)
    
        #静态方法,不可以访问类属性
        @staticmethod
        def staticMethod(explanation):
            print(staticmethod)
    
    a = A()
    a.explantion = "this is new"
    print(a.classMethod("explanation"))
    print(A.classMethod("explanation"))
    

      结果:类方法可以由类调用(因为传入参数cls),与实例调用

    C:Usersg1702543PycharmProjectsuntitledvenvScriptspython.exe "C:/Users/g1702543/PycharmProjects/untitled/Day12/普通 类 静态方法.py"
    this is my programs
    None
    this is my programs
    None

    4.调用类方法和静态方法区别

    class A:
        #类属性
        explantion = "this is my programs"
        #普通方法,或者实例方法
        def normaMethod(self,name):
            print(self.explantion)
    
        #类方法,可以访问类属性
        @classmethod
        def classMethod(cls,explanation):
            print(cls.explantion)
    
        #静态方法,不可以访问类属性
        @staticmethod
        def staticMethod(explanation):
            print(staticmethod)
    
    a = A()
    a.explantion = "this is new"
    print(a.classMethod("explanation"))
    print(A.classMethod("explanation"))
    print(a.staticMethod("explanation"))
    print(A.staticMethod("explanation"))
    

      结果:

    C:Usersg1702543PycharmProjectsuntitledvenvScriptspython.exe "C:/Users/g1702543/PycharmProjects/untitled/Day12/普通 类 静态方法.py"
    this is my programs
    None
    this is my programs
    None
    <class 'staticmethod'>
    None
    <class 'staticmethod'>
    None

     5.property将一个方法变成静态属性

      可以让类与实例进行调用

    class A:
        #类属性
        explantion = "this is my programs"
        #普通方法,或者实例方法
        def normaMethod(self,name):
            print(self.explantion)
    
        #类方法,可以访问类属性
        @classmethod
        def classMethod(cls,explanation):
            print(cls.explantion)
    
        #静态方法,不可以访问类属性
        @staticmethod
        def staticMethod(explanation):
            print(staticmethod)
        @property
        def shuxing(self):
            print(self.explantion)
    a = A()
    a.shuxing
    print(A.classMethod("explanation"))

      结果:

    C:Usersg1702543PycharmProjectsuntitledvenvScriptspython.exe "C:/Users/g1702543/PycharmProjects/untitled/Day12/普通 类 静态方法.py"
    this is my programs
    this is my programs
    None

    实例方法(普通方法)———————————————>  随着实例属性的改变而改变

    类方法(无论是类调用还是实例调用)————————>  都是类属性的值,不随实例属性的变化而变化

    静态方法      —————————————————----—>  不可以访问类属性,故直接输出传入方法的值

     【表格总结】

    善战者,求之于势,不责于人,故能择人而任势
  • 相关阅读:
    ssk文件 窗体皮肤
    子窗体加载时最大化出现异常不正常最大化显示
    android: ADB错误“more than one device and emulator”
    使用adb devices命令报:adb server version (39) doesn't match this client (41);killing
    测试需要关注的测试点以及测试优先级(一)——接口测试
    解决Jenkins可安装插件列表没有可选择插件问题
    Win10同时安装jdk1.7和jdk1.8
    Python中@staticmethod 和@classmethod 的区别
    windows下彻底删除jenkins
    selenium如何保证元素定位的成功率
  • 原文地址:https://www.cnblogs.com/NGU-PX/p/11509916.html
Copyright © 2011-2022 走看看