Python的类、对象,以及classmethod的意义


类型:Python,创建时间:Jan. 1, 2012, 6:46 p.m.

标题无“转载”即原创文章,版权所有。转载请注明来源:http://hgoldfish.com/blogs/article/71/。

先看一下这两行代码:

>>> class Fish:pass
>>> f=Fish()

f就是Fish类的实例,它是一个对象(object),很明显吧。 Fish是类,它也是一个对象(object),如果你以前学的是C++或者Java,可能会难以理解。 不管怎么样,在Python内部,它们都用一个PyObject结构体表示,你可以修改对象的属性, 调用它们的方法。

类与实例两种对象有什么区别呢,下面的代码运行于python 3.1版本:

>>> Fish.isAnimal=True
>>> print(f.isAnimal)
True

我们定义Fish是一种动物,显然f更是一种动物了。

>>> f.name="老鱼"
>>> print(Fish.name)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: type object 'Fish' has no attribute 'name'

我们定义f这条鱼的名字是"老鱼"。这时候,Fish并不会自动拥有名字这个属性,总不能说 鱼都是叫“老鱼”吧。

类的实例可能比较好理解,但是类居然可以有属性,可能有些C++/Java程序员难以理解。

使用classmethod修饰的函数第一个参数是类对象。平时它没什么用,只有继承关系比较复 杂的时候才能派上用场。我以前学classmethod的时候写过一段代码:

class Fish:
    @classmethod
    def __str__(cls):
        s="一只归属于"+cls.order+"的"+cls.chinese_name
        s+=",它的英文名叫"+cls.__name__
        return s

class Goldfish(Fish):
    order="鲤形目"
    chinese_name="金鱼"

    def __str__(self):
        if hasattr(self, "name"):
            return super(Goldfish, self).__str__()+",它的名字叫"+self.name
        return super(Goldfish, self).__str__()

class Angelfish(Fish):
    order="鲈形目"
    chinese_name="燕鱼"

f1=Goldfish()
f1.name="老鱼"
f2=Angelfish()
print(f1)
print(f2)

运行结果:

一只归属于鲤形目的金鱼,它的英文名叫Goldfish,它的名字叫老鱼
一只归属于鲈形目的燕鱼,它的英文名叫Angelfish

标题无“转载”即原创文章,版权所有。转载请注明来源:http://hgoldfish.com/blogs/article/71/。


暂时还没有任何评论。


何不来发表一下您对本文的看法(使用Markdown语法,分段空两行):