Python classmethod继承和覆盖类参数

Python classmethod继承和覆盖类参数,python,class,inheritance,class-method,Python,Class,Inheritance,Class Method,当PersonProfile从PersonBase继承时,我很难理解如何从类方法为PersonProfile赋值 class PersonBase: def __init__(self, contact_no=None, email=None, house=None, category=None, near=None, house_number=None, road=None, unit=None, level=None, staircase=None,

当PersonProfile从PersonBase继承时,我很难理解如何从类方法为PersonProfile赋值

class PersonBase:
    def __init__(self, contact_no=None, email=None, house=None, category=None, near=None, house_number=None, road=None,
                 unit=None, level=None, staircase=None, entrance=None, po_box=None, postcode=None, suburb=None,
                 city_district=None, city=None, island=None, state_district=None, state=None, country_region=None,
                 country=None, world_region=None):
        self.contact_no = contact_no
        self.email = email
        self.house = house
        self.category = category
        self.near = near
        self.house_number = house_number
        self.road = road
        self.unit = unit
        self.level = level
        self.staircase = staircase
        self.entrance = entrance
        self.po_box = po_box
        self.postcode = postcode
        self.suburb = suburb
        self.city_district = city_district
        self.city = city
        self.island = island
        self.state_district = state_district
        self.state = state
        self.country_region = country_region
        self.country = country
        self.world_region = world_region



class PersonProfile(PersonBase):

    @classmethod
    def from_string(cls, full_address):
        """
        Takes raw, unformatted address string and creates a PersonProfile class out of it.
        :param full_address: unformatted address coming from a DB
        :type full_address: str
        :return: PersonProfile class
        :rtype: PersonProfile
        """

        if full_address == "":
            # return empty PersonProfile cls with all its defaults
            return cls(PersonProfile)
        elif full_address is None:
            raise TypeError("Provided object must be of type string")

        # extract phone numbers
        _contact_no = PersonProfile.find_phone_no(full_address)
        if len(_contact_no) != 0:
            cls.contact_no = ",".join(_contact_no)
            for c in _contact_no:
                full_address = full_address.replace(c, '')

        return cls()
因此,当我尝试使用
cls.contact\u no=“,”为PersonProfile.contact\u no分配电话号码时,join(\u contact\u no)
似乎没有任何效果。正确的方法是什么

另外,在该类方法结束时,如何返回所有值,包括在类方法执行期间覆盖的值?我正在使用
return cls()
,但似乎也不起作用

我想让它像这样工作:

p1 = PersonProfile.from_string("(+22) 936107349")
print(p1.contact_no)
--> (+22) 936107349
print(p1.city)
--> None

您希望将解析后的数据提供给
\uuuu init\uuu
方法;通过调用
cls(**key\u word\u arguments)
staticmethod
parse\u full\u address
返回的
kwargs
字典被传递给构造函数

我建议您为独立于类工厂的数据编写一个
解析器
,以及
验证器
,并将其传递给已完全提取的工厂参数

class PersonProfile(PersonBase):

    @classmethod
    def from_string(cls, full_address):
        """
        Takes raw, unformatted address string and creates a PersonProfile class out of it.
        :param full_address: unformatted address coming from a DB
        :type full_address: str
        :return: PersonProfile class
        :rtype: PersonProfile
        """
        kwargs = PersonProfile.parse_full_address(full_address)

        return cls(**kwargs)
    
    @staticmethod
    def parse_full_address(full_address):
        """parses the full_address and returns the parsed data as a dictionary
        currently a stub that returns test data
        """
        return {'contact_no': '(+22) 936107349', 'email': 'a@a.com', 'house': 'Ze Mansion', 'city': 'Dummy Data'}
    
    
p1 = PersonProfile.from_string("(+22) 936107349")
print(p1.contact_no)
print(p1.city)

您希望将解析后的数据提供给
\uuuu init\uuu
方法;通过调用
cls(**key\u word\u arguments)
staticmethod
parse\u full\u address
返回的
kwargs
字典被传递给构造函数

我建议您为独立于类工厂的数据编写一个
解析器
,以及
验证器
,并将其传递给已完全提取的工厂参数

class PersonProfile(PersonBase):

    @classmethod
    def from_string(cls, full_address):
        """
        Takes raw, unformatted address string and creates a PersonProfile class out of it.
        :param full_address: unformatted address coming from a DB
        :type full_address: str
        :return: PersonProfile class
        :rtype: PersonProfile
        """
        kwargs = PersonProfile.parse_full_address(full_address)

        return cls(**kwargs)
    
    @staticmethod
    def parse_full_address(full_address):
        """parses the full_address and returns the parsed data as a dictionary
        currently a stub that returns test data
        """
        return {'contact_no': '(+22) 936107349', 'email': 'a@a.com', 'house': 'Ze Mansion', 'city': 'Dummy Data'}
    
    
p1 = PersonProfile.from_string("(+22) 936107349")
print(p1.contact_no)
print(p1.city)