gpt4 book ai didi

python - 动态改变类的一个方法

转载 作者:行者123 更新时间:2023-12-01 05:40:32 32 4
gpt4 key购买 nike

我的问题是双重的。首先,我想定义一个具有一个方法 scale 的类,该方法的行为根据分配给其属性之一的值而有所不同。下面是我当前尝试使用 XXX 标记代码中缺少某些内容的部分。

class C(object):
def __init__(self):
self._scaling_method = None

def same(self, u):
return u

def double(self, u):
return u * 2

scale = same

@property
def scaling_method(self):
return self._scaling_method

@scaling_method.setter
def scaling_method(self, value):
if value.lower() == "double":
self._scaling_method = "double"
print "Scaling method set to 'double'."
# XXX method scale should be set to double
elif value.lower() == "same":
self._scaling_method = "same"
print "Scaling method set to 'same'."
# XXX method scale should be set to same
else:
print "Unknown scaling method."

如果cC的实例,我希望能够做到

c.same(3) # yields 3
c.double(3) # yields 6
c.scale(3) # yields 3 because scale defaults to same
c.scaling_method = "double"
c.scale(3) # yields 6

正确设置后,我希望能够使用参数设置 scaling_method 属性,并在 __init__ 中相应地定义 scale 方法。目前,我在第二部分中看到的唯一解决方案是在类的核心和 __init__ 部分中定义每个缩放方法,这看起来相当尴尬。

编辑:我刚刚注意到 this answer此处可能会进行调整。

最佳答案

正如所评论的,尚不清楚您是否想在类的基础上或实例的基础上进行操作。这是一个在实例基础上工作的解决方案。我重载了缩放方法:

class C(object):
def __init__(self):
self._scaling_method = None

def same(self, u):
return u

def double(self, u):
return u * 2

scale = same

@property
def scaling_method(self):
return self._scaling_method

@scaling_method.setter
def scaling_method(self, value):
if value.lower() == "double":
self._scaling_method = "double"
self.scale = self.double
elif value.lower() == "same":
self._scaling_method = "same"
self.scale = self.same
else:
print "Unknown scaling method."

如果您想要在类的基础上使用它,请将 self.scale = ... 替换为self.__class__.scale = ...。注意:这可能被认为是 hacky因为我真的要换类(class)了。

然后

sage: c = C()
sage: c.scale(3)
3
sage: c.scaling_method = "double"
sage: c.scale(3)
6

请注意,该类的其他对象不受影响:

sage: cc = C()
sage: cc.scale(4)
8

如果您想在类的基础上具有相同的行为:

class C(object):
_scaling_method = None

def same(self, u):
return u

def double(self, u):
return u * 2

scale = same

@property
def scaling_method(self):
return self._scaling_method

@scaling_method.setter
def scaling_method(self, value):
if value.lower() == "double":
self.__class__._scaling_method = "double"
self.__class__.scale = self.double
elif value.lower() == "same":
self.__class___.scaling_method = "same"
self.__class__.scale = self.same
else:
print "Unknown scaling method."

然后如前面的代码所示:

sage: c = C(); cc = C()
sage: c.scale(2), cc.scale(3)
(2, 3)
sage: c.scaling_method = "double"
sage: c.scale(2)
4

但现在 cc 也受到影响:

sage: cc.scale(3)
6

关于python - 动态改变类的一个方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17651054/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com