使用字符串的 class 的常规 setter
General setter for a class using strings
假设我有一个名为“Employee”的 class,它是一堆不同的属性。我可以创建一个通用的 getter ,它基本上会像这样根据其名称的字符串获取每个属性,但我不知道如何创建那种 setter 这样我就不必每次都做 employee1.age = 22
之类的事情。为每个属性创建多个 setter 会非常混乱。
class Employee:
def __init__(self, name, age):
self.name = name
self.age = age
self.address = "Somewhere"
self.job = None
def getter(self, name):
return getattr(self, name, None)
def setter(self, name, amount):
pass
您可以使用 setattr()
并将其包装在您的 setter
方法中,如下所示:
def setter(self, name, amount):
return setattr(self, name, amount)
所以你可以这样称呼它
e = Employee("Albert", 169)
e.setter("age", 16)
当您现在检查 e.age
时,您会看到
>>> e.age
16
感谢 Joe Carboni 的回答,我设法创建了一个我想调用 ultimate_getter()
的函数。放在这里给大家用。
def ultimate_getter(obj, name, limit = 12):
if name.count(".") == 0:
return getattr(self, name, None)
else:
count = 0
previous = None
current = None
previous = obj
while name.count(".") > 0 and count < limit:
index = name.find(".")
previous = getattr(previous, name[0:index])
name = name[index + 1:]
count += 1
if name.count(".") == 0:
current = getattr(previous, name)
return current
它基本上是 setattr()
的更高级版本,它可以遍历文本,因此您在想要使用某种嵌套 [=] 时不必多次使用 setattr()
18=].
假设我有一个名为“Employee”的 class,它是一堆不同的属性。我可以创建一个通用的 getter ,它基本上会像这样根据其名称的字符串获取每个属性,但我不知道如何创建那种 setter 这样我就不必每次都做 employee1.age = 22
之类的事情。为每个属性创建多个 setter 会非常混乱。
class Employee:
def __init__(self, name, age):
self.name = name
self.age = age
self.address = "Somewhere"
self.job = None
def getter(self, name):
return getattr(self, name, None)
def setter(self, name, amount):
pass
您可以使用 setattr()
并将其包装在您的 setter
方法中,如下所示:
def setter(self, name, amount):
return setattr(self, name, amount)
所以你可以这样称呼它
e = Employee("Albert", 169)
e.setter("age", 16)
当您现在检查 e.age
时,您会看到
>>> e.age
16
感谢 Joe Carboni 的回答,我设法创建了一个我想调用 ultimate_getter()
的函数。放在这里给大家用。
def ultimate_getter(obj, name, limit = 12):
if name.count(".") == 0:
return getattr(self, name, None)
else:
count = 0
previous = None
current = None
previous = obj
while name.count(".") > 0 and count < limit:
index = name.find(".")
previous = getattr(previous, name[0:index])
name = name[index + 1:]
count += 1
if name.count(".") == 0:
current = getattr(previous, name)
return current
它基本上是 setattr()
的更高级版本,它可以遍历文本,因此您在想要使用某种嵌套 [=] 时不必多次使用 setattr()
18=].