经验大分享:python类函数,实例函数,静态函数

简介: 经验大分享:python类函数,实例函数,静态函数

一、实现方法

class Function(object):

# 在类定义中定义变量

cls_variable = "class varibale"

def init(self):

# 在构造函数中创建变量

self.instance_variable = "instance variable"

def instance_method(self):

print(self.cls_variable)

print(self.instance_variable)

print("this is a instance method")

@staticmethod

def static_method():

print(Function.cls_variable)

# print(Function.instance_variable) 此处会报错,无法访问实例变量

print("this is a static method")

@classmethod

def class_method(cls):

print(cls.cls_variable)

# print(cls.instance_variable) 此处会报错,无法访问实例变量

print("this is a class method")

@classmethod

def set_class_variable(cls):

cls.cls_variable = 'new class variable'

def set_instace_varibale(self):

self.instance_variable = 'new instance varibale'

# 类实例可以调用类方法和静态方法

function1 = Function()

function1.set_class_variable()

function1.class_method()

function1.instance_method()

function1.static_method()

function2 = Function()

function2.set_instace_varibale()

function2.class_method()

function2.instance_method()

function2.static_method()

1、从代码定义中,可以看到只是在默认传入参数的不同。

Function.class_method()

Function.static_method()

# 可以调用实例函数,只不过需要传入实例变量

Function.instance_method(function1)

2、从代码访问中,通过实例访问这三种方法是一样的。但是同时类访问时,不一样,实例函数需要传入实例。

3、函数访问变量中,有很大不同。

@classmethod

def class_method(cls):

print(cls.cls_variable)

# print(cls.instance_variable) 此处会报错,无法访问实例变量

在init函数定义的是实例变量,因为变量前缀添加了self。在类开始时定义的类变量,不需要添加前缀。

在变量访问中,发现类函数和静态函数是无法直接访问实例变量的,因为在后续调用中,不知道是那个实例的。但是实例函数是可以访问类变量的。

4、修改变量的范围

new class variable

this is a class method

new class variable

instance variable

this is a instance method

new class variable

this is a static method

上图是function1中输出的结果。

new class variable

this is a class method

new class variable

new instance varibale

this is a instance method

new class variable

this is a static method

new class variable

这是function2的结果,则class variable都变化了。

如果通过类方法修改变量,则所有实例中的类变量都会修改,这个类似静态变量了

如果通过实例修改变量,只是修改对应的实例变量。

二、三者选择原则

通过第一节的分析,我们得知三者的不同,在访问权限和方式上,类方法和静态方法有很多相同之处。与实例方法的区别就是看看这个方法是不是实例独有的方法,或者需要访问实例变量的。另一个不同就是在继承上了。

1、类方法和静态方法

# -- coding: utf-8 --

"""

@Time : 2017/12/29 9:50

@Author:dongbl

@Description:

"""

class Function(object):

X = 1

Y = 2

@staticmethod

def averag(mixes):

return sum(mixes) / len(mixes)

@staticmethod

def static_method():

# 通过function调用,如果类名修改,此处需要修改不太方便

return Function.averag(Function.X, Function.Y)

@classmethod

def class_method(cls):

return cls.averag(cls.X, cls.Y)

class Subclass(Function):

X =3

Y = 5

@staticmethod

def averag(mixes):

return sum(mixes) / 3

func = Subclass()

print(func.static_method())

print(func.class_method())

1、调用方式不同,另一方面就是如果类名修改,函数也修改

2、继承。这是两者最大的不同

1.5

2.6666666666666665

上面是两者的输出。

子类的实例继承了父类的static_method静态方法,调用该方法,还是调用的父类的方法和类属性。

子类的实例继承了父类的class_method类方法,调用该方法,调用的是子类的方法和子类的类属性。

这就是最大的不同,静态方法在类没有初始化,已经加载了,后续继承和她就没有关系了。同时静态方法关键明确指明了调用了Function的方法了,所以就无法修改了。这是本质。

三、类方法和实例方法

类中最常用的方法是实例方法, 即通过通过实例作为第一个参数的方法。

如果现在我们想写一些仅仅与类交互而不是和实例交互的方法会怎么样呢?在Python2.2以后可以使用@classmethod装饰器来创建类方法.

比如我们创建一个类:

class DateTest():

def init(self,year,month,day):

self.year = year

self.day = day

self.month = month

def print_date(self):

print("{}:{}:{}".format(self.year,self.month,self.day))

如果用户输入的是“2017-12-02”这样的字符,我们在调用类之前就需要调整一下。

这个设计角度可以理解每个实例都可以调用这个转化函数。

# -- coding: utf-8 --

"""

@Time : 2017/12/29 9:50

@Author:dongbl

@Description:

"""

class DateTest():

def init(self,year,month,day):

self.year = year

self.day = day

self.month = month

def print_date(self):

print("{}:{}:{}//代码效果参考:http://www.ezhiqi.com/bx/art_789.html".format(self.year,self.month,self.day))

@classmethod

def get_date(cls,string_date):

year,month,day = map(int,string_date.split('-'))

return cls(year,month,day)

t = DateTest(2017,9,10)

r = DateTest.get_date("2017-12-09")

r.print_date()

t.print_date()

classmethod主要用途是作为构造函数。

Python只有一个构造函数new,如果想要多种构造函数就很不方便。只能在new里面写一堆if isinstance 。

有classmethod之后就可以用classmethod来写不同的构造函数,比如:

dict.fromkeys

fractions.Fraction.from_decimal

inspect.Signature.from_function

python里面大部分classmethod最后都是 return cls(XXX), return XXX.new ()之类的

staticmethod主要用途是限定namespace,也就是说这个函数虽然是个普通的function,但是它只有这个class会用到,不适合作为module level的function。这时候就把它作为staticmethod。

如果不考虑namespace的问题的话直接在module里面def function就行了。

四、参考文献

1、python类的静态方法和类方法区别

2、知乎经典解答

相关文章
|
26天前
|
测试技术 Python
【03】做一个精美的打飞机小游戏,规划游戏项目目录-分门别类所有的资源-库-类-逻辑-打包为可玩的exe-练习python打包为可执行exe-优雅草卓伊凡-持续更新-分享源代码和游戏包供游玩-1.0.2版本
【03】做一个精美的打飞机小游戏,规划游戏项目目录-分门别类所有的资源-库-类-逻辑-打包为可玩的exe-练习python打包为可执行exe-优雅草卓伊凡-持续更新-分享源代码和游戏包供游玩-1.0.2版本
101 31
【03】做一个精美的打飞机小游戏,规划游戏项目目录-分门别类所有的资源-库-类-逻辑-打包为可玩的exe-练习python打包为可执行exe-优雅草卓伊凡-持续更新-分享源代码和游戏包供游玩-1.0.2版本
|
1月前
|
前端开发 搜索推荐 编译器
【01】python开发之实例开发讲解-如何获取影视网站中经过保护后的视频-用python如何下载无法下载的视频资源含m3u8-python插件之dlp-举例几种-详解优雅草央千澈
【01】python开发之实例开发讲解-如何获取影视网站中经过保护后的视频-用python如何下载无法下载的视频资源含m3u8-python插件之dlp-举例几种-详解优雅草央千澈
108 34
【01】python开发之实例开发讲解-如何获取影视网站中经过保护后的视频-用python如何下载无法下载的视频资源含m3u8-python插件之dlp-举例几种-详解优雅草央千澈
|
1月前
|
Python
[oeasy]python057_如何删除print函数_dunder_builtins_系统内建模块
本文介绍了如何删除Python中的`print`函数,并探讨了系统内建模块`__builtins__`的作用。主要内容包括: 1. **回忆上次内容**:上次提到使用下划线避免命名冲突。 2. **双下划线变量**:解释了双下划线(如`__name__`、`__doc__`、`__builtins__`)是系统定义的标识符,具有特殊含义。
31 3
|
1月前
|
JSON 监控 安全
深入理解 Python 的 eval() 函数与空全局字典 {}
`eval()` 函数在 Python 中能将字符串解析为代码并执行,但伴随安全风险,尤其在处理不受信任的输入时。传递空全局字典 {} 可限制其访问内置对象,但仍存隐患。建议通过限制函数和变量、使用沙箱环境、避免复杂表达式、验证输入等提高安全性。更推荐使用 `ast.literal_eval()`、自定义解析器或 JSON 解析等替代方案,以确保代码安全性和可靠性。
41 2
|
1月前
|
人工智能 编译器 Python
python已经安装有其他用途如何用hbuilerx配置环境-附带实例demo-python开发入门之hbuilderx编译器如何配置python环境—hbuilderx配置python环境优雅草央千澈
python已经安装有其他用途如何用hbuilerx配置环境-附带实例demo-python开发入门之hbuilderx编译器如何配置python环境—hbuilderx配置python环境优雅草央千澈
41 0
python已经安装有其他用途如何用hbuilerx配置环境-附带实例demo-python开发入门之hbuilderx编译器如何配置python环境—hbuilderx配置python环境优雅草央千澈
|
30天前
|
存储 人工智能 Python
[oeasy]python061_如何接收输入_input函数_字符串_str_容器_ 输入输出
本文介绍了Python中如何使用`input()`函数接收用户输入。`input()`函数可以从标准输入流获取字符串,并将其赋值给变量。通过键盘输入的值可以实时赋予变量,实现动态输入。为了更好地理解其用法,文中通过实例演示了如何接收用户输入并存储在变量中,还介绍了`input()`函数的参数`prompt`,用于提供输入提示信息。最后总结了`input()`函数的核心功能及其应用场景。更多内容可参考蓝桥、GitHub和Gitee上的相关教程。
16 0
|
2月前
|
数据挖掘 vr&ar C++
让UE自动运行Python脚本:实现与实例解析
本文介绍如何配置Unreal Engine(UE)以自动运行Python脚本,提高开发效率。通过安装Python、配置UE环境及使用第三方插件,实现Python与UE的集成。结合蓝图和C++示例,展示自动化任务处理、关卡生成及数据分析等应用场景。
172 5
|
2月前
|
Python
Python中的函数是**一种命名的代码块,用于执行特定任务或计算
Python中的函数是**一种命名的代码块,用于执行特定任务或计算
64 18
|
2月前
|
数据可视化 DataX Python
Seaborn 教程-绘图函数
Seaborn 教程-绘图函数
85 8
|
2月前
|
数据采集 存储 XML
python实战——使用代理IP批量获取手机类电商数据
本文介绍了如何使用代理IP批量获取华为荣耀Magic7 Pro手机在电商网站的商品数据,包括名称、价格、销量和用户评价等。通过Python实现自动化采集,并存储到本地文件中。使用青果网络的代理IP服务,可以提高数据采集的安全性和效率,确保数据的多样性和准确性。文中详细描述了准备工作、API鉴权、代理授权及获取接口的过程,并提供了代码示例,帮助读者快速上手。手机数据来源为京东(item.jd.com),代理IP资源来自青果网络(qg.net)。

热门文章

最新文章