Проверяйте одно и то же во всех методах класса. Как избежать повторения кода - PullRequest
1 голос
/ 22 марта 2019

Obs: Конечно, я мог бы просто создать метод, который проверял бы, и вызывать этот метод внутри всех моих других методов.Но мне интересно, возможно ли сделать что-то, о чем я думал некоторое время.

ЧТО МНЕ НУЖНО:

У меня есть класс, где все моиметоды должны проверять, является ли параметр (объект), который он получает, значением None и имеет ли он определенный метод.Давайте сделаем это просто.

Интересно, есть ли что-то простое, например, следующий код?

Вот пример:

def validate(obj):
    return not obj or obj.can_validate()

class MyClass:

    def __init__(self):
        pass

    @validate(obj)
    def my_method_1(self, obj):
        print(obj)

    @validate(obj)
    def my_method_2(self, obj):
        print(obj)

    @validate(obj)
    def my_method_3(self, obj):
        print(obj)


class Validator1:

    def __init__(self):
        pass

class Validator2:

    def __init__(self):
        pass

    def can_validate(self):
        pass

my_class = MyClass()

obj_1 = None
obj_2 = Validator1()
obj_3 = Validator2()

print(x.my_method_1(obj_1))
print(x.my_method_2(obj_2))
print(x.my_method_3(obj_3))

# The output would be something like this>>
# output:
# <empty line because obj_1 is None>
# <empty line because obj_2 has no method can_validate()>
# __Class__...something <since it's not none and has can_validate() method>

Еслинет ничего похожего на это, какой должен быть самый чистый и правильный способ сделать это, избегая повторения кода и «тонны кода»?

1 Ответ

1 голос
/ 22 марта 2019

С минимальными изменениями в существующем коде:

def validate(func):
    def modified(self, obj):
        if obj and hasattr(obj, 'can_validate'):
            return func(self, obj)
        return None  # None will be printed. Change it to '' to print empty line
    return modified


class MyClass:

    def __init__(self):
        pass

    @validate
    def my_method_1(self, obj):
        print(obj)

    @validate
    def my_method_2(self, obj):
        print(obj)

    @validate
    def my_method_3(self, obj):
        print(obj)


class Validator1:

    def __init__(self):
        pass

class Validator2:

    def __init__(self):
        pass

    def can_validate(self):
        pass

x = MyClass()

obj_1 = None
obj_2 = Validator1()
obj_3 = Validator2()

print(x.my_method_1(obj_1))
print(x.my_method_2(obj_2))
print(x.my_method_3(obj_3))

выход:

None
None
<__main__.Validator2 object at 0x7f6185ca9e10>
None
...