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

是否可以在不更改同一类的所有其他实例的情况下更改实例的方法实现?

花烨
2023-03-14
问题内容

我不太了解python(在:D之前从未使用过它),但是我似乎无法在网上找到任何东西。也许我只是没有在Google上找到正确的问题,但是我去了:

我想更改实例的特定方法的实现。当我搜索它时,我发现您可以做到,但是它更改了同一类的所有其他实例的实现,例如:

def showyImp(self):
    print self.y

class Foo:
    def __init__(self):
        self.x = "x = 25"
        self.y = "y = 4"

    def showx(self):
        print self.x

    def showy(self):
         print "y = woohoo"

class Bar:
    def __init__(self):
        Foo.showy = showyImp
        self.foo = Foo()

    def show(self):
        self.foo.showx()
        self.foo.showy()

if __name__ == '__main__':
    b = Bar()
    b.show()
    f = Foo()
    f.showx()
    f.showy()

这不能按预期方式工作,因为输出如下:

x = 25

y = 4

x = 25

y = 4

我希望它是:

x = 25

y = 4

x = 25

y = woohoo

我试图通过以下方式更改Bar的init方法:

def __init__(self):
    self.foo = Foo()
    self.foo.showy = showyImp

但是我收到以下错误消息:

showyImp()恰好接受1个参数(给定0)

是的,我尝试使用setattr(),但似乎与相同self.foo.showy = showyImp

有什么线索吗?:)


问题答案:

从Python 2.6开始,您应该使用types模块的MethodType类:

from types import MethodType

class A(object):
    def m(self):
        print 'aaa'

a = A()

def new_m(self):
    print 'bbb'

a.m = MethodType(new_m, a)

但是,正如另一个答案指出的那样,这对于新型类的“魔术”方法(例如)无效__str__()



 类似资料:
  • 我已经从源代码处构建并安装了另一个glibc,并且我想让现有的用C++编写的可执行文件与自定义glibc一起运行,以供实验之用。为了做到这一点,我尝试更改可执行文件的加载程序。首先,在/lib64下创建了一个名为的链接,其路径指向新的加载程序 其次,通过文本编辑器修改了可执行文件中的加载器路径,将“/lib64/ld-linux-x86-64.so.2”更改为“/lib64/ld_linux-x8

  • 问题内容: 答案 (请在下面阅读,他们各自的作者提供了宝贵的见解): “ writable:false”防止分配新值, 但是 Object.defineProperty不是分配操作,因此将忽略“ writable”的值 属性属性是继承的,因此,在每个子类/实例上,一个属性将保持不可写状态,直到一个子类(或子类实例)将“可写”的值本身更改回true为止 问题 : 有关属性“可写”描述符的MDN文档指

  • 问题内容: 我最近开始学习Scala,但对它们的泛型也通过类型擦除实现感到失望(但并不感到惊讶)。 我的问题是,Scala是否可以使用通用化泛型,或者需要以某种方式更改JVM?如果确实需要更改JVM,则到底需要更改什么? 问题答案: 否-如果该Scala字节码不支持统一的泛型,则Scala不可能作为Java等效字节码运行。 当您问 “需要更改什么?”时 ,答案是: 字节码规范 。当前,字节码不允许

  • 是否可以在没有实体的情况下使用JpaRepository?在这种情况下,将其替换为DTO。 如下示例所示 这种情况有替代方案吗? 注意:DTO已经映射,但我不想创建视图来将此DTO转换为实体。 我已经验证了这个主题,但没有重大进展,请使用无实体的JpaRepository交互样式 我在试这个 接口- 公共接口BffDTOInterface2{ } 我有这个错误

  • 对于这个示例: null 是否有类似这样的语句用于此检查?或者我应该使用

  • 我试图实现一个链表类在C和我有问题。我有添加新节点的=运算符。 链接列表类接口: 这里我有=重载实现: 此外,我还有“数组”访问重载方法: 一切正常-我检查了dibugger, 问题是-=不在“head”中保存新节点- 有人知道为什么新的分配没有链接到头- 谢谢!!