问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何在Python中使用static,class,abstract方法

发布网友 发布时间:2022-04-24 23:22

我来回答

2个回答

热心网友 时间:2022-04-18 03:30

方法在Python中是如何工作的

方法就是一个函数,它作为一个类属性而存在,你可以用如下方式来声明、访问一个函数:

Python

1

2

3

4

5

6

7

8

>>> class Pizza(object):

...     def __init__(self, size):

...         self.size = size

...     def get_size(self):

...         return self.size

...

>>> Pizza.get_size

<unbound method Pizza.get_size>

Python在告诉你,属性_get_size是类Pizza的一个未绑定方法。这是什么意思呢?很快我们就会知道答案:

Python

1

2

3

4

>>> Pizza.get_size()

Traceback (most recent call last):

File "<stdin>", line 1, in <mole>

TypeError: unbound method get_size() must be called with Pizza instance as first argument (got nothing instead)

我们不能这么调用,因为它还没有绑定到Pizza类的任何实例上,它需要一个实例作为第一个参数传递进去(Python2必须是该类的实例,Python3中可以是任何东西),尝试一下:

Python

1

2

>>> Pizza.get_size(Pizza(42))

42

太棒了,现在用一个实例作为它的的第一个参数来调用,整个世界都清静了,如果我说这种调用方式还不是最方便的,你也会这么认为的;没错,现在每次调用这个方法的时候我们都不得不引用这个类,如果不知道哪个类是我们的对象,长期看来这种方式是行不通的。

那么Python为我们做了什么呢,它绑定了所有来自类_Pizza的方法以及该类的任何一个实例的方法。也就意味着现在属性get_size是Pizza的一个实例对象的绑定方法,这个方法的第一个参数就是该实例本身。

Python

1

2

3

4

>>> Pizza(42).get_size

<bound method Pizza.get_size of <__main__.Pizza object at 0x7f3138827910>>

>>> Pizza(42).get_size()

42

和我们预期的一样,现在不再需要提供任何参数给_get_size,因为它已经是绑定的,它的self参数会自动地设置给Pizza实例,下面代码是最好的证明:

Python

1

2

3

>>> m = Pizza(42).get_size

>>> m()

42

更有甚者,你都没必要使用持有Pizza对象的引用了,因为该方法已经绑定到了这个对象,所以这个方法对它自己来说是已经足够了。

也许,如果你想知道这个绑定的方法是绑定在哪个对象上,下面这种手段就能得知:

Python

1

2

3

4

5

6

7

>>> m = Pizza(42).get_size

>>> m.__self__

<__main__.Pizza object at 0x7f3138827910>

>>> # You could guess, look at this:

...

>>> m == m.__self__.get_size

True

显然,该对象仍然有一个引用存在,只要你愿意你还是可以把它找回来。

在Python3中,依附在类上的函数不再当作是未绑定的方法,而是把它当作一个简单地函数,如果有必要它会绑定到一个对象身上去,原则依然和Python2保持一致,但是模块更简洁:

Python

1

2

3

4

5

6

7

8

>>> class Pizza(object):

...     def __init__(self, size):

...         self.size = size

...     def get_size(self):

...         return self.size

...

>>> Pizza.get_size

<function Pizza.get_size at 0x7f307f984dd0>

静态方法

静态方法是一类特殊的方法,有时你可能需要写一个属于这个类的方法,但是这些代码完全不会使用到实例对象本身,例如:

Python

1

2

3

4

5

6

7

class Pizza(object):

@staticmethod

def mix_ingredients(x, y):

return x + y

def cook(self):

return self.mix_ingredients(self.cheese, self.vegetables)

这个例子中,如果把_mix_ingredients作为非静态方法同样可以运行,但是它要提供self参数,而这个参数在方法中根本不会被使用到。这里的@staticmethod装饰器可以给我们带来一些好处:

热心网友 时间:2022-04-18 04:48

class 方法直接写
static方法在方法前加上@staticmethod
abstract方法先从abc导入
from abc import abstractmethod
然后在方法前加上@abstractmethod
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
江苏海事职业技术学院提前招生专业有哪些? 江苏海事职业技术学院是985还是211 江苏海事职业技术学院是全日制吗? 江苏海事职业技术学院地址在哪里 江苏海事职业技术学院有哪些学院? 江苏海事职业技术学院在南京有几个校区,新生报道是到哪个校区 江苏海院是本科吗 江苏海事职业学院是几类大学? 江苏海事职业学院怎么样 正确使用mysqlupdate语句 太原办护照需要什么材料 太原办理护照需要什么材料 在山西省大同市办理护照要哪些材料 太原杏花岭区办理护照要带什么材料 太原办护照需要什么材料? 山西省太原市公安局办理护照需要什么证件 为Win8开启Aero透明效果 Win8.1系统怎么开启Aero特效 刚安装的Win8系统怎么优化 win8怎么把dwm进程关闭或暂停 win8开启aero 怎样优化笔记本win8系统不卡,变快的最佳方法 俄罗斯简化版win8.1系统中aeroglass怎么卸载 如何在win8系统中开启aero特效功能 win8没有aero及win8如何开启aero特效 为什么Win8,Win10就没有Aero毛玻璃特效了? 刚装的win8怎么没有aero透明效果 win8怎么开启aero效果? win8玩游戏显示这个,怎么办? 怎么取消aero glass for win8 特效 山西省办理护照需要什么、有效期是几年 请问python的抽象是什么,求解 为什么使用抽象基类在Python python抽象基类是什么?用途是什么? python里面也有java中的抽象类和接口吗 能介绍下Python3.x的接口怎么设计的吗?什么是抽象类,能举个例子吗?_百... python 抽象类 python里面也有java中的抽象类和接口吗? Python3中,eval和float有什么区别 如何在Python中正确使用static,class,abstract方法 陶瓷锅时间长了污垢怎么清洗? 手机中的RAM和ROM都是什么意思? 智能手机的RAM容量和ROM容量分别是什么意思? 怎么判断苹果手机是不是真机? 苹果手机怎么查是否真机 怎么查iphone是不是正品 分辨真假方法介绍 带有主字的成语有哪些 主的成语 主字四字成语大全? 主的成语有哪些成语大全