- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
class Book:
def __init__(self,title,author):
self.title = title
self.author = author
def __str__(self):
return '{} by {}'.format(self.title,self.author)
class Bookcase:
def __init__(self,books=None):
self.books = books
@classmethod
def create_bookcase(cls,book_list):
books = []
for title,author in book_list:
books.append(Book(title,author))
return cls(books)
大家好。我试图了解类方法在上面的以下情况中是如何工作的。
When we return cls(books), does the __init__ method get called to return an instance of the classes books (cls.books instead of self.books)
或
does returning cls(books) not have anything to do with using the init method and returning self.books?
最佳答案
内部create_bookcase
, 那cls(books)
确实调用了 __init__
方法。*
但是,它调用了 __init__
cls
的方法| , 而不是 __init__
Bookcase
的方法| .
有什么区别?
class StoreBookcase(Bookcase):
def __init__(self, book_list, backstock=None):
super().__init__(book_list)
self.backstock = backstock if backstock else []
现在如果我调用 StoreBookcase.create_bookcase
, 当它这样做时 cls(books)
, 那cls
是StoreBookcase
.
当然StoreBookcase
可能想要覆盖 create_bookcase
采取可选的backstock
范围。但是在子类中没有额外参数的情况下,或者当您对默认值满意时,您可以只使用基类的 classmethod
。像这样。所以,classmethod
s 可用于为整个层次结构创建“替代构造函数”。
* 从技术上讲,它称为 __new__
方法; __init__
仅在 __new__
时被调用返回 cls
的实例,或者当然,如果您明确调用它。但是大多数类只使用 object.__new__
, 它返回 cls
的一个实例, 所以 __init__
被调用。
关于python - 难以理解类方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49331856/
我想模拟这个函数: function getMetaData(key) { var deferred = $q.defer(); var s3 = vm.ini
我是一名优秀的程序员,十分优秀!