如何在 python 3.x 中的相同 class 的命名空间中调用 class 方法
How to call class method within namespace of the same class in python 3.x
使用 python 个实例时,可以使用 self
访问相同 class 的绑定方法。这解析为对应于层次结构中相同 class 的方法。
class A:
def f(self):
return 1
def __init__(self):
self.v = self.f()
class B(A):
def f(self):
return 2
b = B()
# b.v is set to 2
但是,在使用 class 方法时,没有明显的方法可以访问与上面相同的 class 方法。
在我的用例中,上面的f
需要一个class方法,我需要根据f
对应设置class变量v
相同 class。有点像:
class A:
@classmethod
def f(cls):
return 1
v = resolution_of_calling_class.f()
class B(A):
@classmethod
def f(cls):
return 2
# B.v should be 2
编辑:v
其实是parentclass定义的一个属性,应该找一个childclass[=重写的方法21=]
我不是 100% 确定我明白你想做什么。
我在上面使用了你的代码并且
class A:
@classmethod
def f(cls):
return 1
class B:
@classmethod
def f(cls):
return 2
print(B.f())
给我 2 就像我预期的那样。 B 是否应该像第一个示例中那样是 A 的 child class?
您只需要覆盖 __new__
方法,因为它在 __init__
之前被调用,其目的是创建一个实例,该实例将由 __init__
初始化。
class A:
def __new__(cls, *args, **kwargs):
cls.v = cls.f()
return super().__new__(cls, *args, **kwargs)
@classmethod
def f(cls):
return 1
class B(A):
@classmethod
def f(cls):
return 2
a = A()
print(a.v)
b = B()
print(b.v)
1
2
使用 python 个实例时,可以使用 self
访问相同 class 的绑定方法。这解析为对应于层次结构中相同 class 的方法。
class A:
def f(self):
return 1
def __init__(self):
self.v = self.f()
class B(A):
def f(self):
return 2
b = B()
# b.v is set to 2
但是,在使用 class 方法时,没有明显的方法可以访问与上面相同的 class 方法。
在我的用例中,上面的f
需要一个class方法,我需要根据f
对应设置class变量v
相同 class。有点像:
class A:
@classmethod
def f(cls):
return 1
v = resolution_of_calling_class.f()
class B(A):
@classmethod
def f(cls):
return 2
# B.v should be 2
编辑:v
其实是parentclass定义的一个属性,应该找一个childclass[=重写的方法21=]
我不是 100% 确定我明白你想做什么。
我在上面使用了你的代码并且
class A:
@classmethod
def f(cls):
return 1
class B:
@classmethod
def f(cls):
return 2
print(B.f())
给我 2 就像我预期的那样。 B 是否应该像第一个示例中那样是 A 的 child class?
您只需要覆盖 __new__
方法,因为它在 __init__
之前被调用,其目的是创建一个实例,该实例将由 __init__
初始化。
class A:
def __new__(cls, *args, **kwargs):
cls.v = cls.f()
return super().__new__(cls, *args, **kwargs)
@classmethod
def f(cls):
return 1
class B(A):
@classmethod
def f(cls):
return 2
a = A()
print(a.v)
b = B()
print(b.v)
1
2