在不使用全局的情况下使用用户输入从外部 class 调用函数

Calling a function from outside class with user input without using global

我试图避免使用全局,而是创建了一个 class。我在调用 class 时遇到问题,相反,我收到以下错误

TypeError: phone.__init__() missing 1 required positional argument: 'NUMBER_INPUT'

有什么想法吗?提前致谢!

class phone:
    
        def __init__(self,NUMBER_INPUT):
            self.NUMBER_INPUT = NUMBER_INPUT
    
        def phone_number(self):
            """validate user input of phone number"""
            while True:
                self.NUMBER_INPUT = input("Please enter your phone number: ")
                if  re.fullmatch(r"\d{3}-\d{3}-\d{4}" ,self.NUMBER_INPUT):
                    print("You phone number is: " + self.NUMBER_INPUT)
                    break
                print("Please enter a valid phone number ex. 123-456-5678")
    
    phone().phone_number()

您必须在调用 phone() 时为 NUMBER_INPUT 提供一个值,例如 phone("123").phone_number()

但是如果您在构造函数中为 NUMBER_INPUT 使用虚拟值会更好,例如:

class phone:
    
        def __init__(self):
            self.NUMBER_INPUT = ""
    
        def phone_number(self):
            """validate user input of phone number"""
            while True:
                self.NUMBER_INPUT = input("Please enter your phone number: ")
                if  re.fullmatch(r"\d{3}-\d{3}-\d{4}" ,self.NUMBER_INPUT):
                    print("You phone number is: " + self.NUMBER_INPUT)
                    break
                print("Please enter a valid phone number ex. 123-456-5678")
    
phone().phone_number()

所以,我认为您既没有阅读文档,也没有 watched/read 任何关于 Python class 的教程。那我就在这里给大家解释一下。

Class 是一个“对象项目”。它可能有预定义的方法、预定义的值。它也可能有一种动态构造这些的方法。

Class对象首先需要实例化,然后初始化。这意味着首先你需要创建一个class的实例,然后初始化默认值。

Python 有 2 种方法。

__new__() 创建一个 class 和 returns 的新实例。它已经为每个 Python class 实现,但可能有特殊情况需要您覆盖它。

__init__(*args, **kwargs) 初始化 class 的值。您必须在此处或全局定义 non-static 值 class.

因此,在 python 中创建一个 class 对象是通过这样调用 class 实现的

A_instance = A(*args, **kwargs)

字面意思是create me instance of A with these args and kwargs

所以在您的代码中,您正在使用(实际上覆盖)__init__(*args, **kwargs)args = (NUMBER_INPUT,)kwargs = None

因此,每次创建 phone 的对象时都必须提供 NUMBER_INPUT,如下所示:

phone1 = phone("123-456-7890")
phone2 = phone("098-765-4321")