类型: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/。
暂时还没有任何评论。