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

动态将基类混入Python中的实例

钱和安
2023-03-14
问题内容

是否可以在运行时将基类添加到对象实例(而不是类!)?沿着怎样的路线的东西Object#extend在Ruby中的工作原理:

class Gentleman(object):
  def introduce_self(self):
    return "Hello, my name is %s" % self.name

class Person(object):
  def __init__(self, name):
    self.name = name

p = Person("John")
# how to implement this method?
extend(p, Gentleman)
p.introduce_self() # => "Hello, my name is John"

问题答案:

这动态地定义了一个新类GentlePerson,并p为其分配了新的类:

class Gentleman(object):
  def introduce_self(self):
    return "Hello, my name is %s" % self.name

class Person(object):
  def __init__(self, name):
    self.name = name

p = Person("John")
p.__class__ = type('GentlePerson',(Person,Gentleman),{})
print(p.introduce_self())
# "Hello, my name is John"

根据您的要求,这会修改p的基础,但不会更改其p原始类Person。因此,的其他实例Person不受影响(并且会引发AttributeErrorifintroduce_self的调用)。

尽管没有在问题中直接提出要求,但我将为Googlers和好奇心求助者补充说,也可以动态更改类的基础,但前提是(AFAIK)仅当该类不直接继承自object

class Gentleman(object):
  def introduce_self(self):
    return "Hello, my name is %s" % self.name

class Base(object):pass
class Person(Base):
  def __init__(self, name):
    self.name = name

p = Person("John")
Person.__bases__=(Gentleman,object,)
print(p.introduce_self())
# "Hello, my name is John"

q = Person("Pete")
print(q.introduce_self())
# Hello, my name is Pete


 类似资料:
  • 问题内容: 我有类名称的列表,想动态创建它们的实例。例如: 如何在Python中动态创建该实例?谢谢! 问题答案: 这通常被称为反思或自省。找出类似的问题,这些问题可以回答您要尝试做的事情: Python是否具有与Java类forname等效的名称 您可以使用字符串实例化Python中的类吗

  • 问题内容: 我正在尝试使用反射使匿名类的实例。但是有时我在实例化过程中看到了奇怪的行为。 请看看这些类似的代码片段 该代码运行良好,并且预期输出 之后,我决定以简单的方式更改代码(只是添加了java.util.Calendar) 这是我得到的输出: 如您所见-尚未创建新实例。 有人能解释一下这种变化的原因吗? 谢谢 问题答案: 这是一个非常简单的问题,答案很复杂。在我尝试解释时,请多多包涵。 查看

  • 我试着写一个小函数,它接受两个列表,并根据另一个列表的元素对一个进行排序。所以类似于: 将产生一个排序列表。 然而,可能是一个不同的列表,比如整数、浮点数或其他列表。理想情况下,我希望我的程序能够获取我抛出的任何列表,根据

  • 2.1.3 Python 的动态类型* 如果将计算机内存单元比喻成宾馆的房间,那么编程语言中的变量可以理解成这些房间的“门牌标识”。将一个数据存入变量,实际上是存入该变量所标识的内存单元;而访问一 个变量,当然就是访问该变量所标识的内存单元中的数据。 绝大多数编程语言中对变量的使用有严格的类型限制,一个变量固定作为某内存单元的 标识,并且该单元只能存储特定类型的数据。这就好比宾馆的房间分为客房、员

  • 问题内容: 说有: 这里可能是和是 不是 : 我该怎么办,通话不会触发? 换句话说,我知道可以在运行时手动将类方法添加到类中。但是是否有可能自动执行此操作,比如说每当缺少类方法时,它都会创建一些虚拟方法? 换句话说,只有当我可以用我的字典来代替时,它才能处理-但似乎不可写… 问题答案: 您可以通过使用metaclass上的钩子来实现。 演示: 请注意,我们将调用结果直接设置到该类上,有效地将其缓存

  • 问题内容: 我需要动态创建一个类。为了更详细,我需要动态创建Django类的子类。 通过“动态”,我打算基于用户提供的配置创建一个类。 例如 我想要一个命名为该类的子类的类。 该类应具有所选属性的列表。 ....在这种情况下 有什么有用的提示吗?:) 问题答案: 您可以通过调用内置函数并传递适当的参数来动态创建类,例如: 它适用于新型类。我不确定这是否也适用于老式类。