【问题标题】:Python set variables types inside classPython在类中设置变量类型
【发布时间】:2021-12-25 11:41:05
【问题描述】:

我正在尝试为我的类变量设置可接受的内置类型。 如果给定类型不正确,我想抛出异常。 有没有比使用 isinstance() 的 setter 更好的方法?

我的第一次尝试:

class Address:
    city: str
    building_number: str or int
    apartment_number: int
    street: str

    def __init__(self, city, building_number, apartment_number, street):
        self.city = city
        self.building_number = building_number
        self.apartment_number = apartment_number
        self.street = street

不幸的是,无论类型如何,它都会编译。

我的第二次尝试:

class Address:
    def __init__(self, city: str, building_number: str, apartment_number: int, street: str):
        self.city = city
        self.building_number = building_number
        self.apartment_number = apartment_number
        self.street = street

这个在创建类时实际上显示了错误的类型,但它编译时没有抛出任何错误或消息。

【问题讨论】:

    标签: python class types typing


    【解决方案1】:

    isinstance() 是一种安全的方法,但如果您只想输入更少,您可以使用由“+”运算符完成的类型检查,如下所示

    class Address:
        city: str
        building_number: str or int
        apartment_number: int
        street: str
    
        def __init__(self, city:str, building_number:str, apartment_number:int, street:str):
            self.city = "" + city
            self.building_number = "" + building_number
            self.apartment_number = 0 + apartment_number
            self.street = "" + street
    
    x = Address(1, "a", "b", "c")
    

    而且stacktrace消息是有意义的:

    Traceback (most recent call last):
      File "test.py", line 14, in <module>
        x = Address(1, "a", "b", "c")
      File "test.py", line 9, in __init__
        self.city = "" + city
    TypeError: must be str, not int
    

    【讨论】:

      【解决方案2】:

      我试过了,没有报错:

      class Address:
          def __init__(self, city: str, building_number: str, apartment_number: int, street: str):
              self.city = city
              self.building_number = building_number
              self.apartment_number = apartment_number
              self.street = street
      
      a = Address(1, "asassa", "shoudbeanint", "asas")
      
      print (a.city)
      print (a.apartment_number)
      

      【讨论】:

        猜你喜欢
        • 2010-09-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-23
        • 1970-01-01
        • 1970-01-01
        • 2022-06-14
        • 1970-01-01
        相关资源
        最近更新 更多