当前位置: 首页 > 面试题库 >

如何使用Python伪造类型

胥智
2023-03-14
问题内容

我最近DocumentWrapper在Python中开发了一个围绕某些ORM文档对象命名的类,以透明地向其中添加一些功能,而不用任何方式更改其接口。

我对此只有一个问题。假设我User包裹了一些物体。呼叫isinstance(some_var, User)将返回,False因为some_var确实是的一个实例DocumentWrapper

有没有办法伪造Python中的对象类型以具有相同的调用返回True


问题答案:

测试对象的 类型 通常是python中的反模式。在某些情况下,测试对象的 “鸭子类型” 是有意义的,例如:

hasattr(some_var, "username")

但是,即使这是不希望的,例如,即使包装器使用某种魔术__getattribute__来正确地代理属性,该表达式也可能返回false的原因也是有原因的。

通常最好允许变量仅采用一种抽象类型,并且可能只采用一种None。应通过将可选输入的数据传递到不同变量中来实现基于不同输入的不同行为。您想做这样的事情:

def dosomething(some_user=None, some_otherthing=None):
    if some_user is not None:
        #do the "User" type action
    elif some_otherthing is not None:
        #etc...
    else:
         raise ValueError("not enough arguments")

当然,所有这些都假定您对执行类型检查的代码具有某种程度的控制。假设不是。为了使“
isinstance()”返回true,该类必须出现在实例的基址中,或者该类必须具有__instancecheck__。由于您无法控制该类中的任何一个,因此您必须在实例上使用一些假名。做这样的事情:

def wrap_user(instance):
    class wrapped_user(type(instance)):
        __metaclass__ = type
        def __init__(self):
            pass
        def __getattribute__(self, attr):
            self_dict = object.__getattribute__(type(self), '__dict__')
            if attr in self_dict:
                return self_dict[attr]
            return getattr(instance, attr)
        def extra_feature(self, foo):
            return instance.username + foo # or whatever
    return wrapped_user()

我们正在做的是在需要包装实例时动态创建一个新类,并实际上从包装对象的继承__class____metaclass__如果原始对象有一些我们实际上不希望遇到的额外行为(例如,查找具有特定类名的数据库表),那么我们也将覆写额外的麻烦。这种样式的一个很好的方便之处在于,我们不必在包装类上创建任何实例属性self.wrapped_object,因为它在
类创建时 就存在,所以不需要。



 类似资料:
  • 问题内容: 我想从下面的网站获取内容。如果我使用Firefox或Chrome之类的浏览器,则可以获取所需的真实网站页面,但是如果我使用Python请求包(或命令)来获取它,它将返回完全不同的HTML页面。我以为网站的开发人员为此做了一些阻碍,所以问题是: 如何使用python请求或命令wget伪造浏览器访问? 问题答案: 提供标题: 假用户代理 最新的简单useragent伪造者与真实世界数据库

  • 问题内容: 所有, 我正在尝试在一些古老的Java代码中进行一些单元测试(无接口,无抽象等)。 这是一个使用ServletContext的servlet(我假设它是由Tomcat设置的),并且它的数据库信息在web.xml / context.xml文件中设置。现在,我已经弄清楚了如何制作Fake ServletContext,但是代码已经 遍布整个地方(因此替换它是不可行的)。我需要找到一种方法

  • 问题内容: 我正在为进行AJAX调用的JavaScript写一些QUnit测试。 为了隔离,我重写以将AJAX调用的参数数组写入变量。这可以测试方法如何使用AJAX函数,但是我很难测试 从位于http://api.jquery.com/load/的文档中: 当检测到成功的响应时(即,当textStatus为“成功”或“未修改”时),. load()将匹配元素的HTML内容设置为返回的数据。 因此,

  • 我们中的两个人在不同的GIT分支中制作了一个迁移脚本。现在,我已经拉动了源开发分支,并更正了 GIT 合并问题,并将我的迁移脚本重命名为最后一个。因此,数据库的新初始化和从开发分支的版本迁移数据库将是可以的。 然而,我的本地测试数据库中有很多数据,所以我手动应用了我在GIT中引入的新迁移脚本。然而,我不能让flyway认为,一切都很好。 那么,我如何才能伪造迁移? 当我尝试迁移时,我收到以下错误:

  • 问题内容: 是否可以伪造或劫持变量的内容? 我想伪造一个请求: 我如何用PHP做到这一点?CURL可以这样做吗? 问题答案: 我认为您的意思是远程伪造。简短的答案是可以。关于它多么容易的长答案取决于您要伪造它的方式。 如果您不关心接收响应,那么它就像打开原始套接字到目标并伪造源IP地址一样简单。我不确定在PHP中是否真的容易实现,因为所有PHP的套接字实现都在TCP级别或更高级别。但我确信这是可能

  • 我想使用“faker”库在JSON文件中生成假数据,如下所示。 空手道配置。js,我做了以下工作: 在sample.json: 但我在“空手道配置”中遇到了类似“找不到”require“关键字的错误。js' 请帮忙。