gpt4 book ai didi

python - 类和实例的相同方法

转载 作者:太空宇宙 更新时间:2023-11-03 14:32:50 24 4
gpt4 key购买 nike

我有类 Books 和方法 select 。还有一个名为 book 的类的实例。我希望能够同时执行 Books.select(where='...')book.select(where='...'):

class Books():
def select(obj, where):
print(obj, where)

book = Books()
Books.select(where='asdf')
book.select(where='asdf')

上面显然不行,因为select是一个实例绑定(bind)方法:

Traceback (most recent call last):
File "test.py", line 7, in <module>
Books.select(where='asdf')
TypeError: select() takes exactly 2 arguments (1 given)

工作代码:

class Books():
@staticmethod
def select(obj, where):
print(obj, where)

book = Books()
Books.select(Books, where='asdf')
Books.select(book, where='asdf')

我得到:

vic@wic:~/projects/snippets$ python3 test.py 
<class '__main__.Books'> asdf
<__main__.Books object at 0x17fd6d0> asdf

但我必须手动将类或其实例作为第一个参数传递给 select 方法 - 这不是我想要的。

如果我让 select 成为一个类方法:

class Books():
@classmethod
def select(obj, where):
print(obj, where)

book = Books()
Books.select(where='asdf')
book.select(where='asdf')

我总是得到一个类作为第一个参数:

vic@wic:~/projects/snippets$ python3 test.py 
<class '__main__.Books'> asdf
<class '__main__.Books'> asdf

但我想在第二种情况下获得一个实例。

那么,有没有一种方法可以在不手动将类/实例作为第一个参数传递给静态方法的情况下完成我想要的?

最佳答案

你可以使用 descriptor :

class Select(object):
def __get__(self,obj,objtype):
x=objtype if obj is None else obj
def select(where):
print(x,where)
return select
class Books(object):
select=Select()

book = Books()
Books.select(where='asdf')
book.select(where='asdf')

产量

<class '__main__.Books'> asdf
<__main__.Books object at 0xb7696dec> asdf

关于python - 类和实例的相同方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7750896/

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