假设我有一个 FakePerson
类,它模仿基类 RealPerson
的所有属性和功能,没有扩展它。在 Python 3 中,是否可以通过仅修改 FakePerson 来伪造
类。例如:isinstance()
以便将 FakePerson
识别为 RealPerson
对象
class RealPerson():
def __init__(self, age):
self.age = age
def are_you_real(self):
return 'Yes, I can confirm I am a real person'
def do_something(self):
return 'I did something'
# Complicated functionality here
class FakePerson(): # Purposely don't extend RealPerson
def __init__(self, hostage):
self.hostage = hostage
def __getattr__(self, name):
return getattr(self.hostage, name)
def do_something(self):
return 'Ill pretend I did something'
# I don't need complicated functionality since I am only pretending to be a real person.
a = FakePerson(RealPerson(30))
print(isinstance(a, RealPerson))
假设我有一个模仿 Pandas DataFrame 行(namedtuple
对象)的大部分/所有功能的类。如果我有一个行列表 list_of_rows
,Pandas 会通过 pandas.DataFrame(list_of_rows)
生成一个 DataFrame 对象。但是,由于 list_of_rows
中的每个元素都不是 namedtuple
而只是一个“假的”,构造函数无法将这些“假的”行对象识别为真实的行,即使fake object 确实伪造了 Pandas namedtuple
的所有底层方法和属性。
最佳答案
您可能需要子类化您的 RealPerson
类。
class RealPerson:
def __init__(self, age):
self.age = age
def are_you_real(self):
return 'Yes, I can confirm I am a real person'
def do_something(self):
return 'I did something'
# Complicated functionality here
class FakePerson: # Purposely don't extend RealPerson
def __init__(self, hostage):
self.hostage = hostage
def __getattr__(self, name):
return getattr(self.hostage, name)
def do_something(self):
return 'Ill pretend I did something'
# I don't need complicated functionality since I am only pretending to be a real person.
class BetterFakePerson(RealPerson):
pass
BetterFakePerson.__init__ = FakePerson.__init__
BetterFakePerson.__getattr__ = FakePerson.__getattr__
BetterFakePerson.do_something = FakePerson.do_something
a = FakePerson(RealPerson(30))
print(isinstance(a, RealPerson))
b = BetterFakePerson(RealPerson(30))
print(isinstance(b, RealPerson))
希望这个答案对你来说不会太晚 LOL
关于python - 伪造对象是否是 Python 中类的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62903828/