如何指定方法参数必须是某个类

时间:2012-06-28 14:33:58

标签: python

所以我有一个这样的课程:

 class Encoder(object):

     movie = None

     def __init__(self, movie_instance):
         self.movie = movie_instance

     def encode_profile_hd(self):
         print "profile 1"

     def encode_profile_sd(self):
         print "profile 2"

如何指定传递给构造函数的movie_instance参数必须是Movie类?

我试过了:

def __init__(self, Movie movie_instance):

但这不起作用。对不起,如果这是显而易见的。

5 个答案:

答案 0 :(得分:4)

Python通常依赖于duck-typing,并且人为地限制函数的输入参数被认为是不好的风格,因为这会使代码变得不那么灵活。只需清楚地记录要求,如果参数不符合要求,代码将无论如何都会失败。

答案 1 :(得分:3)

您可以使用isinstance

def __init__(self,movie_instance):
    if(not isinstance(movie_instance, Movie)):
         raise ValueError("movie_instance must be an instance of class Movie")

这适用于Movie个实例以及从Movie继承的任何内容。

值得注意的是,很多人会说在Python中,这个成语不应该经常使用。如果看起来像电影,闻起来像电影(电影有气味吗?)和电影一样,为什么不把它当作电影呢? (换句话说,尝试像电影一样使用对象,并处理在不起作用时引发的异常。)

答案 2 :(得分:1)

Python是一种动态类型语言,您不能像在静态类型语言中那样预先声明变量类型。

答案 3 :(得分:0)

构造函数不是__init__它是__new__。进一步注意__del__不是析构函数。

Python的哲学是鸭子打字(除非使用ABC),这意味着所有可以表现为鸭子和像鸭子一样的嘎嘎声的东西都可能是鸭子。

显式类型检查是针对数据对象模型的,应该避免,除非你有特定的情况。

答案 4 :(得分:0)

你不想这样做。您应该做的是记录您的功能要求。这样,只要它实现了必需的属性,就可以构建一个不同的类并将其用作函数的参数。

这方面的一个例子是iterators。具有__iter__()next()函数的任何对象都可以用作迭代器。另一个例子是file object。具有文件属性的任何对象都可以用作函数参数中的文件。 StringIO就是这种对象的一个​​例子。