zoukankan      html  css  js  c++  java
  • Python 静态方法、类方法

    今天我们来讨论一下Python类中所存在的特殊方法——静态方法、类方法。

    一.定义

    静态方法

    一种简单函数,符合以下要求:

    1.嵌套在类中。

    2.没有self参数。

    特点

    1.类调用、实例调用,静态方法都不会接受自动的self参数。

    2.会记录所有实例的信息,而不是为实例提供行为。

     

    类方法

    一种函数,符合以下特征

    1.类调用、或实例调用,传递的参数是一个类对象。

    二.需要特殊方法的情况(用途)

    程序需要处理与类而不是与实例相关的数据。也就是说这种数据信息通常存储在类自身上,不需要任何实例也可以处理。

    例如:

    1.记录有一个类创建的实例的数目。

    2.维护当前内存中一个类的所有实例的列表。

     

    以上情况也可以同以下方式解决:

    在类定义之外生成一个的简单函数

    例1:简单函数.py

    # 记录一个类创建的实例的数目
    
    def printNumInstance():  # 打印出创建实例的数量
        print "Number of instance created:", Spam.numInstance # 调用类数据属性
    
    class Spam:
        numInstance = 0
        def __init__(self):
            Spam.numInstance = Spam.numInstance + 1 # 每创建一个类,就自加一次

    输出结果:

    >>> a = Spam()
    >>> b = Spam()
    >>> c = Spam()
    >>> printNumInstance()
    Number of instance created: 3
    >>> Spam.numInstance
    3

    因为类名称对简单函数而言,是可读取的全局变量,所以看到上例可以正常工作。

    此外,函数名变成了全局变量,故仅适用于这个单一模块。

    这样处理的缺点如下:

    1.给文件的作用域添加了一个额外的名称,该名称仅能处理单个的类,不能应付多个类需要处理的情况。

    2.该函数与类的直接关联很小,函数的定义可能在数百行代码之外的位置。

    3.该函数位于类的命名空间之外,子类不能通过重新定义来代替或扩展它。

     

    三.实例方法、静态方法、类方法

    三种方法如例2所示

    例2.方法.py

    # -*- coding:utf-8 -*-
    class Methods:
        """实例方法、静态方法、类方法"""
        def imeth(self, x):
            print self, x
    
        def smeth(x):  # 静态方法不需要self参数
            print x
    
        def cmeth(cls, x):  # 类方法需要一个类参数
            print cls, x
    
        # 要设计静态方法和类方法,如下,需调用内置函数staticmethod和clsssmethod.
    
        smeth = staticmethod(smeth)  # 重新赋值方法名称,这些赋值语句会覆盖稍早由def所做的赋值
         cmeth = classmethod(cmeth)

    三种方法调用方式(实例调用,类调用)

    1.实例方法调用

    实例方法调用一定要将类实例化,方可通过实例调用。

    from method import Methods  # 导入模块
    >>> obj = Methods()  #实例化
    >>> obj.imeth(1)  #实例调用
    <method.Methods instance at 0x02D6BD50> 1  #变为imeth(obj, 1)
    >>> Methods.imeth(obj, 1)  #类调用
    <method.Methods instance at 0x02D6BD50> 1  #变为imeth(obj, 1)
    实例方法调用时,Python会把实例自动传入实例方法第一个(最左侧)参数self(也可写成其他变量,但默认写成self)。

    2.静态方法调用

    静态方法调用时不需要实例参数。

    >>> Methods.smeth(3)  # 类调用
    3   # 没有实例被传入
    >>> obj.smeth(3) # 实例调用
    3  # 实例没有传入

     3.类方法调用

    类方法调用时,Python会把类(不是实例)传入类方法第一个(最左侧)参数cls(默认)。

    >>> Methods.cmeth(5)  #类调用
    method.Methods 5  #变为cmeth(Methods, 5)
    >>> obj.cmeth(5)  #实例调用
    method.Methods 5  #变为cmeth(Methods, 5)

  • 相关阅读:
    HYSBZ 3813 奇数国
    HYSBZ 4419 发微博
    HYSBZ 1079 着色方案
    HYSBZ 3506 排序机械臂
    HYSBZ 3224 Tyvj 1728 普通平衡树
    Unity 3D,地形属性
    nginx 的naginx 种包含include关键字
    Redis 出现NOAUTH Authentication required解决方案
    mysql 8.0出现 Public Key Retrieval is not allowed
    修改jar包里的源码时候需要注意的问题
  • 原文地址:https://www.cnblogs.com/twtp/p/5494383.html
Copyright © 2011-2022 走看看