在Python中为变量分配类的用法

时间:2019-02-27 16:44:42

标签: python

是否有充分的理由为什么要将一个类分配给变量,如下面的代码所示?多亏了那个机械师,人们可以做些有用/有趣的事情?

"..."

4 个答案:

答案 0 :(得分:4)

我在生产代码中最经常看到的情况是依赖注入或“编译时”配置。

例如,我可能有一些实现某些策略或命令的类,但是我还没有构造函数的详细信息。

class StrategyOne:...
class StrategyTwo:...

def my_func(vars, Strategy):
    x = some_calculation(vars)
    st = Strategy(x)

django-rest-framework docs

中可以看到使用此配置的示例
class AccountSerializer(serializers.ModelSerializer):
    class Meta:
        model = Account
        fields = ('id', 'account_name', 'users', 'created')

我认为大多数用例都属于“我不想耦合到这个特定类”的原则。 Another level of indirection and all.

type checking example为例。类型[x for x in lst if isinstance(x, types)]的集合上的循环不依赖于任何特定类型,因此与类型列表的内容分离。

答案 1 :(得分:2)

一个重要的用例当然是类型检查或过滤:

class Foo:
    pass

lst = ["bla", 42, Foo()]
types = (str, Foo)
filtered = [x for x in lst if isinstance(x, types)]
# ['bla', <__main__.Foo at 0x7fa3422aa668>]

另一个可能是用于动态创建某个类的实例,例如与defaultdict

class Bar:
    def __init__(self):
        self.value = 0

from collections import defaultdict
d = defaultdict(Bar)
for x, y in [(1,1), (1,2), (2,3), (2,4)]:
    d[x].value += y
print(d[1].value) # 3

答案 2 :(得分:1)

有很多可能性。一种可能是如果您有多个类,并且您想从所有这些类中访问相同的属性。

例如:

import os, io
from google.cloud import vision

vision_client = vision.ImageAnnotatorClient('my-key.json')   

file_name = os.path.join(os.path.dirname(__file__),'image_path.jpg') 

with io.open(file_name, 'rb') as image_file:
    content = image_file.read()

labels = vision_client.label_detection({'content': content})
labels = labes.label_annotations()

print('Labels:')
for label in labels:
    print(label.description)

答案 3 :(得分:0)

我能想到的唯一可能的原因是您将多次调用构造函数。所以,而不是

df["Unit_Column"] = df["parameter"].map(dictitems).fillna("Unit Not Found")

你可以写

x1 = foo()
x2 = foo()
x3 = foo()

因此,您只能用cls = foo x1 = cls() x2 = cls() x3 = cls() 更改cls=foo,其余的都不需要更改。

但是,这仅适用于代码片段,只是为了快速尝试一下。如果您实际上需要多次执行操作,请编写一个函数。