精华内容
下载资源
问答
  • python3 静态方法和类方法的区别

    千次阅读 2017-04-10 00:17:54
    python3 静态方法和类方法的区别

    在python3中用@staticmethod装饰的不带self参数的方法叫做静态方法,没有@staticmethod修饰的不带sefl参数的方法叫类方法,如下图所示的代码中,foo函数为静态方法,bar函数为类方法

    从下图的测试代码可以看出:

    1.静态方法和类方法都可以通过类来调用;

    2.静态方法可以实例来调用,类方法不能通过实例来调用。


    展开全文
  • Python静态方法和类成员方法都可以被类或实例访问,两者概念不容易理清,但还是有区别的: 1)静态方法无需传入self参数,类成员方法需传入代表本类的cls参数; 2)从第1条,静态方法是无法访问实例变量的,而类...
    Python的静态方法和类成员方法都可以被类或实例访问,两者概念不容易理清,但还是有区别的:
    1)静态方法无需传入self参数,类成员方法需传入代表本类的cls参数;
    2)从第1条,静态方法是无法访问实例变量的,而类成员方法也同样无法访问实例变量,但可以访问类变量;
    3)静态方法有点像函数工具库的作用,而类成员方法则更接近类似Java面向对象概念中的静态方法。
     
    实现静态方法和类方法的两种方式
    一、在Python 2.3及之前,用staticmethod和classmethod类型对象包装实现
    例子如下(注意print里的说明):
    class MyClass:
        val1 = 'Value 1'
        def __init__(self):
            self.val2 = 'Value 2'
        def staticmd():
            print '静态方法,无法访问val1和val2'
        smd = staticmethod(staticmd)

        def classmd(cls):
            print '类方法,类:' + str(cls) + ',val1:' + cls.val1 + ',无法访问val2的值'
        cmd = classmethod(classmd)

    执行:
    >>> mc = MyClass()
    >>> mc.smd()
    >>> mc.cmd()
    >>> MyClass.smd()
    >>> MyClass.cmd()
     
    二、在Python 2.4及之后,用装饰器(decorators)实现
    装饰器使用@操作符,例子如下:
    class MyClass:
        val1 = 'Value 1'
        def __init__(self):
            self.val2 = 'Value 2'

        @staticmethod
        def staticmd():
            print '静态方法,无法访问val1和val2'

        @classmethod
        def classmd(cls):
            print '类方法,类:' + str(cls) + ',val1:' + cls.val1 + ',无法访问val2的值'

    不管是以上两种方式中的哪一种,执行情况都是一样的,以方式二执行结果为例分析如下:
    执行:
    >>> mc = MyClass()  # 实例化

    >>> mc.staticmd()  # 实例调用静态方法,无法访问实例变量val1和val2
    >>> 
    静态方法,无法访问val1和val2
     
    >>> mc.classmd()  # 实例调用类方法,注意,这里访问的是类MyClass的变量val1的值,不是实例化后mc的实例变量val1,这里容易混淆,往下看就会明白。val2一直是实例变量,所以无法访问
    >>> 
    类方法,类:__main__.MyClass,val1:Value 1,无法访问val2的值

    >>> MyClass.staticmd()  # 类直接调用静态方法,结果同上面的实例调用,无论是类变量还是实例变量都无法访问
    >>> 
    静态方法,无法访问val1和val2
     
    >>> MyClass.classmd()  # 类直接调用类方法,结果同上面的实例调用
    >>> 
    类方法,类:__main__.MyClass,val1:Value 1,无法访问val2的值
     
    >>> mc.val1 = 'Value changed'  # 改变实例变量val1的值

    >>> mc.classmd()  # 实例调用类方法,注意到cls.val1的值没变,所以,这时的cls.val1是类变量val1,而非实例变量val1
    >>> 
    类方法,类:__main__.MyClass,val1:Value 1,无法访问val2的值

    >>> MyClass.classmd()  # 类直接调用类方法,结果同上面的实例调用
    >>> 
    类方法,类:__main__.MyClass,val1:Value 1,无法访问val2的值
     
    >>> MyClass.val1 = 'Class Value changed'  # 改变类变量val1的值

    >>> mc.classmd()  # 实例调用类方法,注意到cls.val1的值变了,所以,进一步证明了这时的cls.val1是类变量val1,而非实例变量val1
    >>> 
    类方法,类:__main__.MyClass,val1:Class Value changed,无法访问val2的值
     
    >>> MyClass.classmd()  # 类直接调用类方法,结果同上面的实例调用
    >>> 
    类方法,类:__main__.MyClass,val1:Class Value changed,无法访问val2的值
     
    结论
    如果上述执行过程太复杂,记住以下两点就好了:
    静态方法:无法访问类属性、实例属性,相当于一个相对独立的方法,跟类其实没什么关系,换个角度来讲,其实就是放在一个类的作用域里的函数而已。
    类成员方法:可以访问类属性,无法访问实例属性。上述的变量val1,在类里是类变量,在实例中又是实例变量,所以容易混淆。

     

     
     

    转载于:https://www.cnblogs.com/paranoia/p/6248034.html

    展开全文
  • Python中,方法有三种,实例方法,静态方法和类方法。 实例方法:需传入实例对象self,适合用于处理与实例相关的。 静态方法:无需传入实例对象和类对象,适合用于处理类本地相关的。 类方法:需传入类对象,适合...

    Python中,方法有三种,实例方法,静态方法和类方法。
    实例方法:需传入实例对象self,适合用于处理与实例相关的。
    静态方法:无需传入实例对象和类对象,适合用于处理类本地相关的。
    类方法:需传入类对象,适合用于处理类层级相关的。
    以上适用范围并无绝对,看个人理解应用。

    在Python 3.x中,
    1、有用staticmethod()转换过的方法,可以用类和实例直接调用。
    2、无staticmethod()转换的方法,只能用类调用。
    3、类方法,必须用classmethod()转换,并且可以 用类和实例调用。

    展开全文
  • #!/usr/bin/env python # coding:UTF-8 """ @version: python3.x ...@file: 静态方法和类方法.py @time: 2018/10/17 15:40 """ ''' 静态方法:使用@staticmethod标注的方法就...
    #!/usr/bin/env python
    # coding:UTF-8
    
    
    """
    @version: python3.x
    @author:曹新健
    @contact: 617349013@qq.com
    @software: PyCharm
    @file: 静态方法和类方法.py
    @time: 2018/10/17 15:40
    """
    
    '''
    静态方法:使用@staticmethod标注的方法就叫静态方法。如果定义类时,希望某个方法
    不被拿来作为绑定方法,可以使用@staticmethod标注。此时即便使用类对象调用该方法
    对象也不会作为第一个参数传入。但是静态方法还是建议使用类名称来明确的调用。
    
    类方法:使用@classmethod标注的方法就叫类方法。
    先了解一下几个概念:
        1、定义的函数是function类的实例
        2、定义的类时type类的实例
        3、每个模块导入时都会创建一个对象,这个对象是module类的实例
    通过对象的__class__可以得知该对象是从哪个类创建而来的,也可以获取当前类的type,
    如果类中定义的方法标注了@classmethod,那么该方法的第一个参数自动接收所在类的
    type实例。相比较静态方法,类方法不用固定编写类名称在方法中,修改时能够减少工作
    量。
    '''
    
    class Test():
        def __init__(self,tester,name,count):
            self.tester = tester
            self.name = name
            self.count = count
    
        def __str__(self):
            return "{tester}--{name}--{count}".format(**vars(self))
    
        @staticmethod           #静态方法
        def smokeTest(tester):
            return Test(tester,name="动态测试",count="60")
    
        @classmethod            #类方法
        def systemTest(clz,tester):
            return Test(tester,name="动态测试", count="60")
    
    
    test = Test("cxj","动态一期测试",100)
    
    #静态方法调用
    print(Test.smokeTest("caoxinjian"))  #静态方法推荐调用方式,类调用
    print(test.smokeTest("曹新健"))    #静态方法,对象调用,对象不作为第一个参数传入,不推荐使用
    
    #类方法调用
    print(Test.systemTest("xxx"))   #推荐
    print(test.smokeTest("yyy"))    #不推荐
    
    #打印实例
    print(test)
    

     

    展开全文
  • 方法是作为属性保存的函数 def get_size(self): ... 3: Pizza.get_size(), 会报一个缺少参数的错误, 即,python3可以动态的传入方法所属于的的任意一个实例静态方法静态方法是属于的方法,但是实际上
  • 可以直接被或者的实例调用。 1)静态方法无需传入self参数,成员方法需...3静态方法有点像函数工具库的作用,而成员方法则更接近类似Java面向对象概念中的静态方法。 class MyClass: val1 = 'apple' def
  • # staticmathod 静态方法 # classmethod 类方法 # classmethod 涉及静态变量的时候使用 ''' 默认参数 cls 代表这个类 ''' # class Power: # __n = 3 # def __init__(self,num): # self.__num = num # # @property ...
  • 静态方法和类方法的创建: 将它们分别包装在staticmethod和classmethod类的对象中。 静态方法的定义中没有参数self,可直接通过类来调用。 类方法的定义中包含类似于self的参数,通常被命名为cls。对于类方法,也...
  •  2)经常有一些跟类有关系的功能但在运行时又不需要实例和类参与的情况下需要用到静态方法.  3)比如更改环境变量或者修改其他类的属性等能用到静态方法.  4)这种情况可以直接用函数解决, 但这样同样会扩散类...
  • Python静态方法和类成员方法都可以被类或实例访问,两者概念不容易理清,但还是有区别的:1)静态方法无需传入self参数,类成员方法需传入代表本类的cls参数;2)从第1条,静态方法是无法访问实例变量的,而类成员...
  • Python静态方法类方法、属性方法和魔法方法静态方法静态方法使用场景调用方式类方法类方法使用场景调用方式属性方法魔法方法 静态方法 静态方法的作用是可以更好的组织代码,防止代码变大后变得比较混乱。静态...
  • python类中除了实例方法,有时也用到类方法和静态方法,网上找到的详解在这里总结一下。 和类属性的分类不同区分这 3 种类方法是非常简单的,即采用 @classmethod 修饰的方法为类方法;采用 @staticmethod 修饰的...
  • Python 的实例方法、... 实际应用2.1 调用实例方法2.2 调用类方法2.3 调用静态方法2.4 不创建实例调用方法3. 使用类方法实现披萨工厂4. 何时使用静态方法5. 总结 0. 参考资料 Python’s Instance, Class, a...
  • class StaticMethod: @staticmethod def add(a,b): return a+b print StaticMethod.add(1,3) class ClassMethon: @classmethod def add(cls,a,b): return a+b print ClassMethon.ad
  • Python静态方法和类成员方法都可以被类或实例访问,两者概念不容易理清,但还是有区别的:1)静态方法无需传入self参数,类成员方法需传入代表本类的cls参数;2)从第1条,静态方法是无法访问实例变量的,而类成员...
  • 面向对象的三大特性是指:封装、继承多态。 Python3 面向对象 Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象
  • 直接上代码 # coding:utf-8 class Apple: def fun1(self): return 'normal' @staticmethod def fun2(): return 'staticmethod' ... def fun3(cls): return 'classmethod' print Apple.fun1 print A
  • 一般来说,Python 除了拥有实例方法外,还拥有静态方法和类方法,跟Java相比需要理解这个类方法的含义。 实例方法访问方式如下图所示: 类方法访问方式如下图所示: 如果Foo有了子类并且子类覆盖了这个类方法,...
  • python教程_小白入门2021/3/17 学习目标 P 164 类方法和静态方法 P 165 图解静态方法和类方法 P 166 单例设计模式 P 167 练习

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 700
精华内容 280
关键字:

python3静态方法和类方法

python 订阅