根据python中给定对象的类型创建一个新对象

时间:2020-02-26 15:20:23

标签: python-3.x

我有一个函数,该函数获取序列作为参数,并根据序列的类型创建该类型的新对象。

{{1}}

例如,如果'seq'是一个列表,则'new_object'将是一个空列表。 或者,如果“ seq”是一个字符串,那么“ new_object”将是一个空字符串,依此类推。

我该怎么做?

3 个答案:

答案 0 :(得分:2)

这有效:

def make_empty(obj):
    return type(obj)()

>>> make_empty([1, 2, 3])
[]

>>> make_empty('abc')
''

不仅可以用于数字,还可以用于数字:

>>> make_empty(2)
0

或字典:

>>> make_empty({'a': 100})
{}

使用type获取对象的类型,并使用()创建对象的新的空实例。

允许指定允许的类型的版本:

def make_empty(obj, allowed_types=None):
    if allowed_types is None:
        return type(obj)()
    for typ in allowed_types:
        if isinstance(obj, typ):
            return type(obj)()
    raise TypeError(f'Type {type(obj)} not allowed')

现在。

它仍然可以用于非序列:

>>> make_empty(3)
0

但是可以指定允许的类型:

>>> make_empty(3, allowed_types=(str, list, tuple))
...
TypeError: Type <class 'int'> not allowed

序列在允许的情况下有效:

>>> make_empty('abc', allowed_types=(str, list, tuple))
''
>>> make_empty([1, 2, 3], allowed_types=(str, list, tuple))
[]
>>> make_empty((1, 2, 3), allowed_types=(str, list, tuple))
()

如果不允许的话,字典是不允许的:

>>> make_empty({'a': 100}, allowed_types=(str, list, tuple))
...
TypeError: Type <class 'dict'> not allowed 

答案 1 :(得分:0)

您可以访问其__class__()属性。

def empty(obj):
    return obj.__class__()

print(empty(2))  # -> 0
print(empty([1,2,3]))  # -> []

答案 2 :(得分:0)

由于对象是序列,因此可以使用切片来获取相同类型但为空的新对象:

def make_empty(obj):
    return obj[:0]

make_empty(['a', 'b', 'c'])

输出:

[]