我有一个函数private void play() {
player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
stopPlayer();
}
});
player.start();
}
,希望它的参数if 3 in media_info['tracks'].keys():
local_file_info.append(media_info['tracks'][3]['Format'])
else:
local_file_info.append(None)
是实现foobar
和baz
的任何对象。
__gt__
关于如何记录这些类型的参数是否有约定?如果有问题,我正在使用Python 3.5。
答案 0 :(得分:0)
对于__gt__
和__eq__
来说毫无意义,因为object
具有这些属性。
@timgeb:没想到老实说,好点。问题实际上是关于记录这种鸭子类型的问题,所以让我们假装不是这样吗? :)
在一般情况下,我想您可以为自己编写一个实现__subclasshook__
的ABC,然后键入该类的提示。
from abc import ABCMeta, abstractmethod
class FooAndBar(metaclass=ABCMeta):
@abstractmethod
def foo(self):
raise NotImplementedError
@abstractmethod
def bar(self):
raise NotImplementedError
@classmethod
def __subclasshook__(cls, C):
if cls is FooAndBar:
has_foo = any('foo' in X.__dict__ for X in C.__mro__)
has_bar = any('bar' in X.__dict__ for X in C.__mro__)
if has_foo and has_bar:
return True
return NotImplemented
class Foo:
def foo(self):
pass
class FooBar:
def foo(self):
pass
def bar(self):
pass
print(isinstance(Foo(), FooAndBar)) # False
print(issubclass(Foo, FooAndBar)) # False
print(isinstance(FooBar(), FooAndBar)) # True
print(issubclass(FooBar, FooAndBar)) # True
def func(arg: FooAndBar):
pass
请注意,出于特定目的,不需要在foo
中定义bar
和FooAndBar
(无论如何,子类挂钩都会触发),但是忽略这些方法对我来说似乎很奇怪,并且可能代码的读者。