[转载] Python3.0中普通方法、类方法和静态方法的比较

参考链接: Python中的类方法与静态方法

一、语法区别

 

       刚接触Python中的面向对象,对于类方法和静态方法难以区分,通过查找知乎、CSDN论坛,废了好大的劲思路才逐渐明朗,所以就总结顺便分享一下。

 

首先开始编辑代码

# 普通方法、类方法、静态方法的比较

# 普通方法、类方法、静态方法的比较

class Test:

    # 定义类Test的属性

    name = 'python'

    content = '人生苦短,我用python!'

    def normal_method(self): # 普通方法访问类Text的属性

        print(self.content)

    @classmethod  #类方法访问Test类的属性,看到@staticmethod我们就知道这个方法并不需要依赖对象本身的状态

    def class_method(cls):

        print(cls.content)

    @staticmethod  #静态方法,无法访问Test类的属性,

    def static_method():

        print('content')

 

进行测试一

t = Test()

t.content = '人生苦短,及时行乐'#设置对象t的属性

 

t.normal_method()

t.class_method()

t.static_method()

 

# 结果

人生苦短,及时行乐

人生苦短,我用python!

content

使用普通方法、类方法和静态方法都可以通过对象(t)进行调用,但是静态方法和类方法无法访问对象的属性,所以更改对象(t)的属性仅仅只是对普通方法起作用。

 

进行测试二

# Test.content('name')出现错误,普通方法无法通过类调用

Test.class_method()

Test.static_method()

# 结果

人生苦短,我用python!

content

   普通方法无法通过类名调用,但静态方法和类方法是可以的。

 

总结

 

        三种方法都可以通过对象进行调用,但类方法和静态方法无法访问对象属性,类方法通过对象调用获取的仍是类属性(并非对象属性);普通方法无法通过类名调用,类方法和静态方法可以,但静态方法不能进行访问,仅仅只是通过传值得方式(与函数调用相同)

 

二、简单应用

 

通过上面的示例仅仅只是知道三种方法的语法区别,下面继续看看三种方法的具体应用区别

 

示例:用类来实现部分计算器功能,并计算任意两个整数的平方和

 

1. 普通方法

class Test:

    def __init__(self, num1, num2):

        self.num1 = num1

        self.num2 = num2

    def plus(self):

        result = self.num1 + self.num2

        return result

    def multiply(self):

        result = self.num1 * self.num2

        return result

t1 = Test(3, 3)

m = t1.multiply()

t2 = Test(4, 4)

n = t2.multiply()

t3 =Test(m, n)

sum = t3.plus()

print(sum)

 

2. 类方法(@classnethod)

class Test:

    def __init__(self, num1, num2):

        self.num1 = num1

        self.num2 = num2

    def plus(self):

        result = self.num1 + self.num2

        return result

    def multiply(self):

        result = self.num1 * self.num2

        return result

    @classmethod

    def sum(cls, num1, num2):

        t1 = Test(3, 3)

        m = t1.multiply()

        t2 = Test(4, 4)

        n = t2.multiply()

        t3 = Test(m, n)

        print(t3.plus())

Test.sum(3, 4)

3.静态方法(@staticmethod)

class Test:

    def __init__(self, num1, num2):

        self.num1 = num1

        self.num2 = num2

    def plus(self):

        result = self.num1 + self.num2

        return result

    def multiply(self):

        result = self.num1 * self.num2

        return result

    @staticmethod

    def sum(num1, num2):

        s = num1 * num1 + num2 * num2

        print(s)

Test.sum(3, 4)

 

4.总结

 

 

       以上三种方法都能实现示例要求的功能。使用类方法时,求和功能的那部分代码并没有放在类(Test)中,而是作为类的一个成员方法,这样的好处是可以简化对象,增加可读性(直接通过参数num1、num2来实现最终功能),但整个过程仍须类(self)参与;使用静态方法时,仅仅需要通过传递两个参数即可实现,单最终结果仍可作为类方法进行访问。

 

 

5.延伸

 

 

       @classmethod装饰(类方法): 它的作用就是有点像静态类,比静态类不一样的就是它可以传进来一个当前类作为第一个参数。

 

       @staticmethod装饰(静态方法):经常有一些跟类有关系的功能但在运行时又不需要实例和类参与的情况下需要用到静态方法。 比如更改环境变量或者修改其他类的属性等能用到静态方法。这种情况可以直接用函数解决,但这样同样会扩散类内部的代码,造成维护困难。至于静态方法就是写在类里的方法,必须用类来调用(极少数情况下使用,一般都在全局里直接写函数了)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/540459.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

iOS:个人浅谈工厂模式

一、什么是工厂方法? 正式的解释是:在基类中定义创建对象的一个接口,让子类决定实例化哪个类。工厂方法让一个类的实例化延迟到子类中进行。工厂方法要解决的问题是对象的创建时机,它提供了一种扩展的策略,很好地符合了…

scanf 输入十六进制_使用C语言中的scanf()在字符变量中输入十进制,八进制和十六进制值...

scanf 输入十六进制Here, we will declare an unsigned char variable and input different formats value like decimal format, octal format and hexadecimal format. 在这里,我们将声明一个无符号的char变量,并输入不同格式的值,例如十进…

[转载] Python中pass的作用

参考链接: 如何在Python中编写空函数?请使用 pass语句 空语句 do nothing保证格式完整保证语义完整 以if语句为例,在c或c/java中: if(true) ; //do nothing else { //do something } 对应于python就要这样写&#xff…

wrf 嵌套网格作用_在网格系统中使用响应列,嵌套列和偏移列 引导程序

wrf 嵌套网格作用介绍 (Introduction) In the previous article, we have learnt what is grid and grid system and how it works? Now, we will learn about how Responsive column, Nesting Columns and Offset Columns works and how to use them? If you have any doubt…

[看书笔记]《深入java虚拟机》——java体系结构(二)

java虚拟机的三种含义: - 抽象的规范 - 一个具体的实现 - 一个运行中的虚拟机实例 ---------------------java虚拟机的生命周期: java虚拟机实例的天职就是负责运行一个java程序。 启动一个java程序,一个虚拟机实例诞生了;程序关闭…

[转载] 【零基础学爬虫】python中的yield详解

参考链接: 什么时候在Python中使用yield而不是return python中的yield功能比较强大,什么意思呢?如果一个函数f内使用了yield关键词,那么该函数就可以这样使用: for item in f(***): **** 也就是包含yield关键词的函…

全新的membership框架Asp.net Identity(1)——.Net membership的历史

在Asp.net上,微软的membershop框架经历了Asp.net membership到Asp.net simple membership,再到现在的Asp.net Identity. 每一次改变,都使得验证框架更加的适应变化和可定制。这篇文章是Asp.net Identity系列的开篇,主要就membersh…

c语言100位整数变量声明_C ++程序动态声明一个整数变量并打印其内存地址

c语言100位整数变量声明Here, we will learn how we can declare an integer variable dynamically and how to print address of declared memory block? 在这里,我们将学习如何动态声明整数变量,以及如何打印声明的内存块的地址? In C pr…

[转载] python 函数返回多个值

参考链接: 在Python中返回多个值 (廖雪峰Python教程学习笔记) 函数体内部的语句在执行时,一旦执行到return,函数就执行完毕,并将结果返回。 如果没有return语句,函数执行完毕后也会返回结果…

二.编写第一个c#程序(注释,命名空间,类,Main方法,标识符,关键字,输入,输出语句,)...

复习编写一个控制台应用程序,目标是在控制台输出“Hello World” 1.第一步,打开Visual Studio 2012以上版本(我用的是VS 2015),打开完成后出现以下界面 2.第二步,这时候就要新建一个解决方案了,创建解决方案可以直接点…

[转载] Python中定义函数,循环语句,条件语句

参考链接: Python中的局部函数 由于日常程序流中主要是三种结构:顺序,循环,条件,且往往需要自定义函数再调用, 因此今天想学习一下Python中关于定义函数、循环语句和条件语句的写法。 1.定义函数 区…

node oauth2验证_如何设置和使用护照OAuth Facebook身份验证(第1部分)| Node.js

node oauth2验证In my last articles, we looked at the implementation of the passport-local authentication strategy. We also looked at the various requirements to get started with the login form. 在上一篇文章中,我们介绍了护照本地身份验证策略的实现…

vue2.0 引用qrcode.js实现获取改变二维码的样式

vue代码 <template><div class"qart"><div id"qrcode" ref"qrcode"></div><input type"text" id"getval" value"" placeholder"修改这个值改变二维码"></div> <…

[转载] Python列表排序 list.sort方法和内置函数sorted

参考链接&#xff1a; Python中的函数 Python列表排序 list.sort方法和内置函数sorted 很多时候我们获取到一个列表后,这个列表并不满足我们的需求,我们需要的是一个有特殊顺序的列表. 这时候就可以使用list.sort方法和内置函数sorted,本文就是介绍list.sort方法和sorted内…

Java Thread类最终同步的void join(long time_in_ms)方法,带有示例

线程类最终同步无效连接(long time_in_ms) (Thread Class final synchronized void join(long time_in_ms)) This method is available in package java.lang.Thread.join(long time_in_ms). 软件包java.lang.Thread.join(long time_in_ms)中提供了此方法。 join(long time_in_…

RYU控制器安装`

2019独角兽企业重金招聘Python工程师标准>>> 同样是参考了http://linton.tw/2014/02/11/note-how-to-set-up-ryu-controller-with-gui-component/的内容。 1. 由于Ubuntu中自带有Python&#xff0c;因此直接开始安装pip apt-get install python-pip apt-get i…

[转载] mac开发者,你不得不知道的环境变更设置方法(如Java的环境变更 source命令 )

参考链接&#xff1a; 设置Java环境 Mac是基于Unix的&#xff0c;所有先来几个常识与命令&#xff1a; Unix中双引号单引号反引号(" )的区别 Unix中双引号起到“弱引用”的作用:被引用的字符大部分被按照字符字面的意思解释执行&#xff0c;除了了$,\,字符除外。 [因…

人形机器人正在美国史密森尼博物馆中担任导游的工作

Te article has been removed, please visit IncludeHelps home page for more articles 该文章已被删除&#xff0c;请访问IncludeHelp的主页以获取更多文章翻译自: https://www.includehelp.com/News/a-humanoid-robot-is-doing-the-job-of-a-guide-in-the-smithsonian-museu…

normalizr API

APInormalizedenormalizeschemaArrayEntityObjectUnionValuesnormalize(data, schema)Normalizes input data per the schema definition provided. 根据提供的schema定义规范化输入数据。data: required Input JSON (or plain JS object) data that needs normalization.schem…

[转载] 【Java】基础06:HelloWorld入门程序

参考链接&#xff1a; 从Hello World示例开始Java编程 HelloWorld它的中文意思是&#xff1a;“你好&#xff0c;世界”。 仿佛代表着计算机对世界说出来的第一句话&#xff0c;因为它简洁实用&#xff0c;所以被作为入门程序广泛使用。 Java程序开发三步骤&#xff1a;编…