了解OOP和静态方法

时间:2014-07-04 10:01:18

标签: python oop static-methods self

我以前没有用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(自我)方法,因为我之前测试过它并且工作正常。

问题可能出在_l​​impiarCIF(self)方法中,因为我对面向对象编程的不理解以及self词和静态方法的使用。

1 个答案:

答案 0 :(得分:2)

你没有静态方法,你有常规方法,但没有在实例上调用它们

entradaCodigoCIF = input('Enter the VAT number: ')
mi_cif = CheckingCIF(entradaCodigoCIF)
print(mi_cif.cif)
print(mi_cif.validarCodigoCIF())

在实例上引用该方法会为您提供绑定方法,这是一个知道如何调用底层函数并将实例作为第一个参数传递的对象。