python - 伪造对象是否是 Python 中类的实例

标签 python pandas dataframe isinstance

假设我有一个 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/

相关文章:

python - 子进程 python filenotfounderror : [winerror 2]

pandas - 从 Pandas 数据框中提取数据作为列表,同时保留顺序

python - 1 年滚动平均 Pandas 列日期

python - 对 pandas DataFrame 中的空值使用 None 而不是 np.nan

python - Pandas 数据帧 : How to groupby and sort "by blocks"?

python - Flask 表单字段的动态默认值设置

python - 如何将一页请求定向到 Flask 中的某些定义?

python - Matplotlib/v-3.4.2 matplotlibrc 中 latex 前导码的问题

python - 模糊匹配列和合并/连接数据框

python - 如何切片 Pandas 系列中每个元素的不同部分?