Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在一个类的所有方法中验证相同的内容。避免代码重复_Python_Validation_Properties_Reusability - Fatal编程技术网

Python 在一个类的所有方法中验证相同的内容。避免代码重复

Python 在一个类的所有方法中验证相同的内容。避免代码重复,python,validation,properties,reusability,Python,Validation,Properties,Reusability,Obs:当然,我可以创建一个验证方法,并在所有其他方法中调用这个方法。但我想知道是否有可能做一些我想了很久的事情 我需要什么: 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)

Obs:当然,我可以创建一个验证方法,并在所有其他方法中调用这个方法。但我想知道是否有可能做一些我想了很久的事情

我需要什么:

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>
我有一个类,在这个类中,我的所有方法都应该验证它接收的参数(对象)是否为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>
def验证(obj):
返回not obj或obj.can_validate()
类别MyClass:
定义初始化(自):
通过
@验证(obj)
定义我的方法1(自我,obj):
打印(obj)
@验证(obj)
定义我的方法2(自我,obj):
打印(obj)
@验证(obj)
定义我的方法3(自我,obj):
打印(obj)
类别1:
定义初始化(自):
通过
第2类:
定义初始化(自):
通过
def can_验证(自我):
通过
my_class=MyClass()
obj_1=无
obj_2=1()
obj_3=2()
打印(x.my_方法_1(obj_1))
打印(x.my_方法_2(obj_2))
打印(x.my_方法_3(obj_3))
#输出将是这样的>>
#输出:
# 
# 

#_u类_uu…对现有代码进行最小更改的内容:

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
无
没有一个
没有一个

您可以使用问题的可接受答案中所示的方法之一添加类的所有方法的验证,这也适用于用户定义的类。答案的作者更喜欢使用类装饰器。读了这些代码,我几乎被感动了,但是很有意义,非常感谢你给我展示了那个人。也许在我的主要“完整问题”中也是适用的。是的,对相关问题的公认答案相当长(而且很深)。不过,课堂装饰本身并不是一门非常科学,所以我建议只关注答案的这一方面。