我以前没有用OOP编码。我有一些功能来处理和验证增值税号码,我想把它们放在一个类中(稍后,其他类用于处理IBAN帐号来制作模块或包,我不确定两者的区别是什么)。
我使用增值税号码(西班牙语中的CIF),首先,我需要清除除数字和字母之外的任何其他字符。然后验证号码。
输入:
h55/586-75 4
期望的输出:
H55586754
True
实际输出:
h55/586-75 4
False
我的代码:
import re
class CheckingCIF:
_letras = "ABCDEFGHIJKLMNPQRSVW" # Not used yet.
def __init__(self, un_cif):
self.cif = un_cif
self._limpiarCIF()
def _limpiarCIF(self):
self.cif = re.sub('\W', "", self.cif.upper())
return self
def validarCodigoCIF(self):
if len(self.cif) != 9:
return False
numero = self.cif[1:10]
pares = int(numero[1]) + int(numero[3]) + int(numero[5])
impares = 0
for i in range(0, 8, 2):
j = int(numero[i]) * 2
if j < 10:
impares += j
else:
impares += j - 9
digito = str(pares+impares)[-1]
if int(digito) == 0:
checkCIF = 0
else:
checkCIF = 10 - int(digito)
if str(checkCIF) == self.cif[-1]:
return True
else:
return False
if __name__ == "__main__":
entradaCodigoCIF = input('Enter the VAT number: ')
mi_cif = CheckingCIF(entradaCodigoCIF)
print(mi_cif.cif)
print(CheckingCIF.validarCodigoCIF(mi_cif))
问题不在于validarCodigoCIF(自我)方法,因为我之前测试过它并且工作正常。
问题可能出在_limpiarCIF(self)方法中,因为我对面向对象编程的不理解以及self
词和静态方法的使用。
答案 0 :(得分:2)
你没有静态方法,你有常规方法,但没有在实例上调用它们:
entradaCodigoCIF = input('Enter the VAT number: ')
mi_cif = CheckingCIF(entradaCodigoCIF)
print(mi_cif.cif)
print(mi_cif.validarCodigoCIF())
在实例上引用该方法会为您提供绑定方法,这是一个知道如何调用底层函数并将实例作为第一个参数传递的对象。