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)

  • 相关阅读:
    控制台——args参数的赋值方法
    整数排序的几种方法
    基于CentOS系统下的Oracle的安装
    QT的学习
    HDU 2104 hide handkerchief
    HDU 2103 Family Plan
    HDU 2115 I Love This Game
    HDU 2100 Lovekey
    猜数字游戏
    利用Hough变换识别图像中的直线
  • 原文地址:https://www.cnblogs.com/twtp/p/5494383.html
Copyright © 2011-2022 走看看