python 静态方法、类方法(二)

《Python静态方法、类方法》一文中曾用在类之外生成函数的方式,来计算类的实例的个数。本文将探讨用静态方法和类方法来实现此功能。

一使用静态方法统计实例

例1.static.py

# -*- coding:utf-8 -*-
class Spam:
    numInstance = 0

    def __init__(self):
        Spam.numInstance += 1

    def printNumInstance():
        print ‘Number of instance:‘, Spam.numInstance

    printNumInstance = staticmethod(printNumInstance)  # 使用内建函数staticmethod将函数变为静态函数

调用结果:

>>> from static import Spam  # 导入类
>>> a, b, c = Spam(), Spam(), Spam()  #实例化
>>> Spam.printNumInstance()  # 类调用
Number of instance: 3
>>> a.printNumInstance()  # 实例调用,实例参数没有被传入
Number of instance: 3

静态方法调用相对于将PirntNumInstance移到类之外的方法相比较,有以下优点:

1.静态方法把函数名称变成类作用域内的局部变量,使得函数名不会与模块内的其它变量名相冲突。

2.把函数程序代码迁移到其靠近使用的地方,易于寻找。

3.允许子类定制静态方法。如例2所示。

例2.custom_made.py

class Sub(Spam):  # 子类Sub
    def printNumInstance():  # 重新定义
        print ‘Extra stuff...‘
        Spam.printNumInstance()

    printNumInstance = staticmethod(printNumInstance)

调用结果:

>>>a, b = Sub(), Sub()  # 实例化
>>> a.printNumInstance()  #实例调用
Extra stuff...
Number of instance: 2  #重新启动解释器,进行调用。否则应该为5,因为前面已经有三个实例
>>> Sub.printNumInstance() #类调用
Extra stuff...
Number of instance: 2

此外,类可以继承方法而不用重新定义,如下:

>>> class Other(Spam):  # 完全继承静态方法
...     pass
...
>>> c = Other()
>>> c.printNumInstance()
Number of instance: 3

二、使用类方法统计实例

例3:a_class.py

#-*- coding:utf-8 -*-

class Spam:
    numInstance = 0

    def __init__(self):
        Spam.numInstance += 1

    def printNumInstance(cls):  # 接收实例的(最底层)类作为参数,传入cls中
        print ‘Number of instance:‘, cls.numInstance

    printNumInstance = classmethod(printNumInstance)

调用结果:

>>> from a_class import Spam #导入模块
>>> a, b = Spam(), Spam()  #实例化
>>> a.printNumInstance()  #实例调用,传入实例a所在的最底层的类Spam
Number of instance: 2
>>> Spam.printNumInstance()  # 类调用,传入类Spam
Number of instance: 2

三总结

由于类方法总是接收一个实例化的类的最底层的类:

1.静态方法:适用于处理一个类的本地数据

2.类方法:适用于处理类层级中每个类的数据

下面的例子(例4)展示了利用类方法管理每个类的实例计数器。例4的代码中,顶层的超类使用一个类方法来管理状态信息,该信息根据树中的类不同而不同,而且储存在类上。

例4:test.py

class Spam:
    numInstance = 0

    def count(cls):
        cls.numInstance += 1

    def __init__(self):
        self.count()

    count = classmethod(count)

class Sub(Spam):
    numInstance = 0

    def __init__(self):
        Spam.__init__()

class Other(Spam):
    numInstance = 0

调用结果:

>>>x = Spam()
>>>y1, y2 = Sub(), Sub()
>>>z1, z2, z3 = Other(), Other(), Other()
>>>x.numInstance, y1.numInstance, z1.numInstance
1, 2, 3
>>>Spam.numInstance, Sub.numInstance, Other.numInstance
1, 2, 3
时间: 2024-10-12 11:32:00

python 静态方法、类方法(二)的相关文章

Python 静态方法 类方法

静态方法和实例方法的区别主要体现在两个方面: 1. 在外部调用静态方法时,可以使用"类名.方法名"的方式,也可以使用"对象名.方法名"的方式.而实例方法只有后面这种方式.也就是说,调用静态方法可以无需创建对象. 2. 静态方法在访问本类的成员时,只允许访问静态成员(即静态成员变量和静态方法),而不允许访问实例成员变量和实例方法:实例方法则无此限制. 3. 类方法可以被对象调用,也可以被实例调用:传入的都是类对象,主要用于工厂方法,具体的实现就交给子类处理 4. 静态

python静态方法类方法属性方法

Python的静态方法和类成员方法都可以被类或实例访问,两者概念不容易理清,但还是有区别的: 1)静态方法无需传入self参数,类成员方法需传入代表本类的cls参数: 2)从第1条,静态方法是无法访问实例变量的,而类成员方法也同样无法访问实例变量,但可以访问类变量: 3)静态方法有点像函数工具库的作用,而类成员方法则更接近类似Java面向对象概念中的静态方法. 静态方法 @staticmethod    def staticmd():        print '静态方法 @classmetho

python静态方法-类方法

关于类的静态方法:@staticmethod 和 @classmethod 1.使用这两种方法,不用实例化类,直接可以用,如:Stu.say() 2.两种方法的区别: 1.@staticmethod 不需要加参数: 调用类变量用:类名.类变量名: 调用类函数用:类名.函数() 2.@classmethod 需要加参数cls: 调用类变量用:cls.类变量名: 调用类函数用:cls().函数() class Stu(object): country = 'china' # 类变量 def __in

Python基础(二)

Python基础(二) Python 运算符(算术运算.比较运算.赋值运算.逻辑运算.成员运算) 基本数据类型(数字.布尔值.字符串.列表.元组.字典.set集合) for 循环 enumrate range和xrange 编码与进制转换 Python 运算符 1.算术运算: 2.比较运算: 3.赋值运算: 4.逻辑运算:  5.成员运算: 基本数据类型 1.数字 int(整型) 在32位机器上,整数的位数为32位,取值范围为-2**31-2**31-1,即-2147483648-2147483

Python爬虫进阶二之PySpider框架安装配置

关于 首先,在此附上项目的地址,以及官方文档 PySpider 官方文档 安装 1. pip 首先确保你已经安装了pip,若没有安装,请参照 pip安装 2. phantomjs PhantomJS 是一个基于 WebKit 的服务器端 JavaScript API.它全面支持web而不需浏览器支持,其快速.原生支持各种Web标准:DOM 处理.CSS 选择器.JSON.Canvas 和 SVG. PhantomJS 可以用于页面自动化.网络监测.网页截屏以及无界面测试等. 安装 以上附有官方安

Python之路【第三篇】:Python基础(二)

Python之路[第三篇]:Python基础(二) 内置函数 一 详细见python文档,猛击这里 文件操作 操作文件时,一般需要经历如下步骤: 打开文件 操作文件 一.打开文件 1 文件句柄 = file('文件路径', '模式') 注:python中打开文件有两种方式,即:open(...) 和  file(...) ,本质上前者在内部会调用后者来进行文件操作,推荐使用 open. 打开文件时,需要指定文件路径和以何等方式打开文件,打开后,即可获取该文件句柄,日后通过此文件句柄对该文件操作.

Python基础之二:数据类型

四.Python数据类型 数字 字符串 列表 元祖 字典 1.数字类型 整型 表示范围:-2147483648到2147483647,超过该范围的会被当作长整型 示例:num=123 type(num)-返回<type 'int'>,用来测试变量的类型 长整型 表示范围:任意大整数,后跟L或l与整型区别 示例:num=1l type(num)-返回<type 'long'> 浮点型 示例:num=12.0 type(num) -返回<type'float'> 复数型 示

学习编程之Python篇(二)

学习编程与学习踢球.学习演奏并无差别,最佳方式就是不断练习,所以我们鼓励你敲些代码,看看会发生什么,如果这些代码头一次不起作用,没关系,再来,看看你能否把它们纠正过来. 首先是一个简单的快速入门程序,让我们通过了解这个程序的细节,来熟悉Python. 第一项任务:给定半径,计算一个圆的周长和面积. 程序分解: 1.  提示用户输入半径: 2.  应用数学公式,根据获得的半径,得出周长和面积: 3.  输出结果. 代码1.1 运行程序的最简单方法是在IDLE编辑器里打开它,然后选择Run->Run

python学习(二)百度爬虫0.1

参照着网上的爬虫案例(点我),先做了一个demo,基本的爬虫项目创建,以及数据抽取,数据分析,数据保存等等过程基本上有所掌握. 我的需求是需要检索指定的百度贴吧,根据指定的关键字库,搜索出含有关键字的链接,并抽取出来,用于后续告警. 因此,基于需求,分如下步骤: 第一:基于Scrapy创建爬虫项目: 第二:新建TieBaSpider爬虫: 第三:新建外部关键字库dictionary.txt文件,贴吧地址配置url.txt文件: 第一步参考晚上案例. 从第二步开始,编写爬虫,同时创建实例对象以及创