Python del语句,delattr()函数

时间:2020-02-23 14:42:37  来源:igfitidea点击:

Python del语句和delattr()函数用于删除对象的属性。
他们两个都做完全相同的事情。
但是,当我们要动态删除属性(例如,根据用户输入删除对象的属性)时,delattr()函数很有用。

Python del语句

假设我们将Employee类定义为:

class Employee:
  id = -1
  name = ''

  def __init__(self, i, n, r):
      self.id = i
      self.name = n
      self.role = r

  def __str__(self):
      return "Employee[id={}, name={}, role={}]".format(self.id, self.name, self.role)

注意," id"和" name"是类变量,而" role"是实例变量。

我们来看一些使用del语句删除类属性的示例。

e = Employee(10, 'hyman', 'CEO')
print(e)
print(e.id)
print(e.name)
print(e.role)

# del with class attribute
del e.id
print(e)
print(e.id)

del e.name
print(e.name)

输出:

Employee[id=10, name=hyman, role=CEO]
10
hyman
CEO
Employee[id=-1, name=hyman, role=CEO]
-1

因此,当我们使用del语句删除类变量时,在进一步访问中将返回默认值。

现在,让我们看看尝试删除实例变量然后访问它时会发生什么。

del e.role
print(e.role)

输出:

AttributeError: 'Employee' object has no attribute 'role'

因此,当实例属性被删除时,将来对它们的访问将导致AttributeError。

Python delattr()

Python delattr()语法为:

delattr(object, name)

第一个参数是我们要删除其属性的对象。
第二个参数是我们要从对象中删除的属性的名称。

让我们看一些delattr()函数示例。

e = Employee(10, 'hyman', 'CEO')
print(e)
print(e.id)
print(e.name)
print(e.role)

delattr(e, 'id')
print(e)
print(e.id)

delattr(e, 'name')
print(e.name)

输出:

Employee[id=10, name=hyman, role=CEO]
10
hyman
CEO
Employee[id=-1, name=hyman, role=CEO]
-1

让我们看看当我们尝试删除实例变量"角色"时会发生什么。

delattr(e, 'role')
print(e.role)

输出:

AttributeError: 'Employee' object has no attribute 'role'

Python del vs delattr()

从以上示例可以明显看出,del语句和delattr()函数具有相同的作用。
那么什么时候使用del语句,什么时候使用delattr()函数呢?

如果要在程序中静态删除对象属性,则可以使用del语句。
但是,当您要动态分配要删除的属性时,delattr()函数是唯一的方法。
例如,接受用户输入以删除对象属性。
让我们用一个简单的例子来看一下。

# delattr() benefit with dynamic attribute deletion
e = Employee(20, 'Lisa', 'Editor')

print(e)
attr = input('Please enter attribute to delete, valid values are id, name and role\n')
delattr(e, attr)
print(e)

输出:

Employee[id=20, name=Lisa, role=Editor]
Please enter attribute to delete, valid values are id, name and role
id
Employee[id=-1, name=Lisa, role=Editor]

请注意,我要删除类变量。
下图显示了当我们尝试删除实例变量并且稍后我们的程序尝试访问它时的输出。

Employee[id=20, name=Lisa, role=Editor]
Please enter attribute to delete, valid values are id, name and role
role
Traceback (most recent call last):
File "/Users/hyman/Documents/github/theitroad/Python-3/basic_examples/python_del_delattr_examples.py", line 47, in 
  print(e)
File "/Users/hyman/Documents/github/theitroad/Python-3/basic_examples/python_del_delattr_examples.py", line 11, in __str__
  return "Employee[id={}, name={}, role={}]".format(self.id, self.name, self.role)
AttributeError: 'Employee' object has no attribute 'role'

Python删除属性与设置为无

如果要重用该属性,可以将其设置为None。
但是,如果删除实例属性,那么除非再次设置它,否则在访问它时会遇到错误。

# set to None vs del/delattr
e.role = None
print('Role =', e.role)

del e.role
e.role = 'CEO'
print('Role =', e.role)

输出:

Role = None
Role = CEO

删除已删除的属性

如果我们试图删除一个已经删除的属性,我们将得到" AttributeError"。

e = Employee(20, 'Lisa', 'Editor')

del e.id
# del e.id # AttributeError: id

delattr(e, 'name')
# delattr(e, 'name')  # AttributeError: name

删除不存在的属性

如果我们尝试删除不存在的对象属性,则会得到" AttributeError"。

# del e.x  # AttributeError: x
# delattr(e, 'x')  # AttributeError: x