Python extension methods

后端 未结 7 2014
星月不相逢
星月不相逢 2021-02-02 06:39

OK, in C# we have something like:

public static string Destroy(this string s) { 
    return \"\";
}

So basically, when you have a string you ca

7条回答
  •  自闭症患者
    2021-02-02 07:19

    I would use the Adapter pattern here. So, let's say we have a Person class and in one specific place we would like to add some health-related methods.

    from dataclasses import dataclass
    
    
    @dataclass
    class Person:
        name: str
        height: float  # in meters
        mass: float  # in kg
    
    
    class PersonMedicalAdapter:
        person: Person
    
        def __init__(self, person: Person):
            self.person = person
    
        def __getattr__(self, item):
            return getattr(self.person, item)
    
        def get_body_mass_index(self) -> float:
            return self.person.mass / self.person.height ** 2
    
    
    if __name__ == '__main__':
        person = Person('John', height=1.7, mass=76)
        person_adapter = PersonMedicalAdapter(person)
    
        print(person_adapter.name)  # Call to Person object field
        print(person_adapter.get_body_mass_index())  # Call to wrapper object method
    

    I consider it to be an easy-to-read, yet flexible and pythonic solution.

提交回复
热议问题