是否可以在运行时将基类添加到对象实例(而不是类!)?沿着怎样的路线的东西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
不受影响(并且会引发AttributeError
ifintroduce_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类的子类。 通过“动态”,我打算基于用户提供的配置创建一个类。 例如 我想要一个命名为该类的子类的类。 该类应具有所选属性的列表。 ....在这种情况下 有什么有用的提示吗?:) 问题答案: 您可以通过调用内置函数并传递适当的参数来动态创建类,例如: 它适用于新型类。我不确定这是否也适用于老式类。