【发布时间】:2021-07-28 00:01:34
【问题描述】:
我正在重构代码,想知道这是否可能。
def a(array):
class MyClass(object):
def length():
return len(array)
return MyClass
print(a([1,2,3,4]).length())
print(a([1,2,3,4]))
返回
4
<class '__main__.a.<locals>.MyClass'>
我想要:
4
4
努力尝试,我读到了metaclass 和__new__,但不知道该怎么做。
或
class a():
def __init__(self, array):
self.array = array
def length(self):
return len(self.array)
print(a([1,2,3,4]).length()) # 4
print(a([1,2,3,4])) # <__main__.a object at 0x7fab704c9e50>
它不起作用,它有 50% 的功能。
很遗憾,我现在没有时间,但以我今天的知识,不可能用元类来做到这一点。在 sqlite3 中我们可以使用 cur.execute("SQL;"), cur.execute("SQL;").fetchone() 所以可以做到。
class Metaclass(type):
def __new__(metacls, name, bases, attrs):
try:
return attrs['length']()
except KeyError:
pass
return type.__new__(metacls, name, bases, attrs)
def a(array):
class MyClass(metaclass=Metaclass):
def length():
return len(array)
return MyClass
print(a([1,2,3,4]).length()) # <- This is not working.
print(a([1,2,3,4])) # 4
我想知道它是否可以比我的解决方案做得更好或更智能,因为在我看来,使用函数返回类是一种 hack。
研究了这段代码,它不可能知道何时替换返回的对象,我将把它重新输入到没有函数的类。刚刚检查了一个班级的同样问题。将参数从方法传递到元类时遇到问题。
【问题讨论】:
-
答案在答案部分,而不是在问题中,即使您是在回答自己的问题。另外,your answer doesn't work.
-
我看到了问题,我需要重新考虑它。谢谢。
标签: python python-3.x class methods