gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 08:10:11 25 4
gpt4 key购买 nike

观察:当然,我可以创建一个验证方法,并在所有其他方法中调用该方法。但我想知道是否有可能做一些我一直在思考的事情。

我需要什么:

我有一个类,其中我的所有方法都应该验证它接收的参数(对象)是否不是 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 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

关于python - 在类的所有方法中验证相同的内容。避免代码重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55305170/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com