假装对象是否是Python中类的实例

假装对象是否是Python中类的实例,python,pandas,dataframe,isinstance,Python,Pandas,Dataframe,Isinstance,假设我有一个类FakePerson,它模仿基类RealPerson的所有属性和功能,而不扩展它。在Python3中,是否可以通过修改FakePerson类来伪造isinstance()以将FakePerson识别为RealPerson对象。例如: class RealPerson(): def __init__(self, age): self.age = age def are_you_real(self): return 'Yes, I ca

假设我有一个类
FakePerson
,它模仿基类
RealPerson
的所有属性和功能,而不扩展它。在Python3中,是否可以通过修改
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数据帧行(一个
namedtuple
对象)的大部分/所有功能。如果我有一个行列表
listofrows
,Pandas将通过
Pandas.DataFrame(listofrows)
生成一个数据帧对象。但是,由于行的列表中的每个元素都不是名为双的元素,而只是一个“伪元素”,构造函数无法将这些“伪”行对象识别为真实行,即使伪对象伪造了Pandas
namedtuple的所有底层方法和属性。该函数是一个python内置函数,其实现显式地查找对象的(直接、间接或虚拟)类或子类。你所指的“模仿”也被称为。在您的情况下,看起来您确实想要扩展DataFrame行或将其子类化。不过,您可能不必指定属性,但要知道这可能会导致未定义的行为,因为它是特定于实现的。

您可能需要对
RealPerson
类进行子类化

class RealPerson:
定义初始(自我、年龄):
self.age=年龄
定义你是真实的(自我):
返回“是的,我可以确认我是真人”
def do_某事(自我):
返回“我做了些什么”
#这里有复杂的功能
类伪造人:#故意不扩展RealPerson
定义初始(自我,人质):
人质
def _ugetattr _;(self,name):
return getattr(self.hospital,name)
def do_某事(自我):
返回“我会假装我做了什么”
#我不需要复杂的功能,因为我只是假装成一个真实的人。
类BetterFakePerson(RealPerson):
通过
更好的骗子__
更好的骗子。uuu getattr\uuuuu=骗子。uuu getattr__
BetterFakePerson.do\u something=冒牌人。do\u something
a=伪造人(真实人(30))
打印(iInstance(a,RealPerson))
b=更好的决策者(现实人(30))
打印(iInstance(b,RealPerson))

希望这个答案对你来说不会太晚LOL

这听起来像是一个巨大的xy问题。你应该单独考虑你的实际问题,因为这个问题本身很有趣,即使它不是你实际问题的最佳解决方案。考虑到这是Python,我认为你挖得不够深。