我想知道是否有一种方法可以让类定义一个行为像静态方法(可以不使用实例变量调用)和常规方法(可以使用实例变量调用)的方法。
我正在做一个RSA模块,它可以帮助我解决RSA问题,初始化是这样的:
class RSA:
def __init__(self, n: int, e: int, c: int, p=None, q=None, phi=None):
self.n = n
self.e = e
self.c = c
self.p = p
self.q = q
assert p == None or gmpy2.is_prime(p), 'p must be prime'
assert q == None or gmpy2.is_prime(q), 'q must be prime'
self.phi = phi
在那门课上,有一种方法可以把n分解成p和q,它是这样的(使用的算法是无关的,所以我懒得解释)
def fermat_factorization(self, n=None):
if n == None:
n = self.n
t_ = gmpy2.isqrt(n)+1
counter = 0
t = t_ + counter
temp = gmpy2.isqrt((t * t) - n)
while((temp * temp) != ((t * t) - n)):
counter += 1
t = t_ + counter
temp = gmpy2.isqrt((t * t) - n)
s = temp
p = t + s
q = t - s
return p, q
这个实现不起作用。我想做的是让这个方法是动态的,也就是说,可以通过
从外部调用p, q = RSA.fermat_factorization(n) # n is some large number
yet也可以在实例中调用,如:
s1 = RSA(n, 65537, c) # c and n is some large number
p, q = s1.fermat_factorization() # without specifying n because it is already an instance attribute
在python中,您使用模块来处理这类内容,而不是类:
inrsa.py
def fermat_factorization(n):
"""Ordinary function"""
class RSA:
def fermat_factorization(self):
"""Method"""
return fermat_factorization(self.n)
其他地方:
import rsa
x = rsa.fermat_factorization(100)
obj = rsa.RSA(...)
y = obj.fermat_factorization()
一个函数的行为取决于它的调用方式,这是一个灾难的配方。别那样做。