python学习笔记之类

2013年05月26日 分类:学习笔记Python

和其他面向对象的编程语言一样,python也是可以定义类的,下面我将对python中的类做一下总结,主要包括:类的定义、继承、静态方法、类方法、特性和运算符重载。

1.类的定义

和c++一样,Python使用关键字class定义类。

class People(object):
 numbers = 0
 def __init__(self, name, age, male, address):
 	self.name = name
 	self.age = age
 	self.male = male
 	self.address = address
 	People.numbers += 1
 def __del__(self):
 	People.numbers -= 1
 def eat(self, food):
 	print self.name + ' is eating ' + food + '.'
>>> wuyuan = People('wuyuan', 20, True, 'wuyuans.com')
>>> wuyuan.eat('apple')
wuyuan is eating apple.
>>> wuyuan.name
'wuyuan'

类通常由类变量、方法和属性组成,其中类变量相当于c++中类的静态变量,所有该类的实例都可以访问,通常用于保存公共资源和类实例的相关信息,比如实例的数量。Python中类的方法和一般的有点不一样,多了个self,这个相当于c#中的this变量,表示当前对象实例,在类中访问实例方法和属性时都需要使用self来指示。属性就是类的实例变量,也可以说是成员变量,一般在构造函数init中定义,del为类的析构函数。

2.类的继承

在class语句中可以使用以逗号分隔的基类列表来指定继承,如果未指明将默认继承object类。

class Student(People):
 def __init__(self, name, age, male, address, school):
 	self.school = school
 	super(Student, self).__init__(name, age, male, address)	
 def eat(self, food):
 	print 'Student ' + self.name + ' is eating ' + food + '.'
>>> wuyuan.eat('apple')
Student wuyuan is eating apple.

子类可以重定义父类的方法,比如构造函数init,以此来添加子类成员变量。使用super函数也可以在构造函数中调用父类的init,或者直接使用People.init()调用。在使用super时父类在定义时必须继承object类,否则出现TypeError:

<h2>3.静态方法和类方法</h2>
Python中类的方法一般以实例作为第一个参数self传递,但也有例外的情况,比如静态方法和类方法。
<h3>3.1.静态方法</h3>
和其他面向对象语言一样,Python的类中也可以定义静态方法,使用@staticmenthod装饰器定义。因为没有传递self参数,静态方法不会对任何实例类型进行操作。

class Foo(object): @staticmethod def add(x, y): return x + y >>> Foo.add(1, 2) 3

如果在编写类时需要采用不同的方式创建新实例,比如工厂模式,则通常使用静态方法。
<h3>3.2.类方法</h3>
类方法和静态方法很相似,不同的是当前类将作为第一个参数cls传递,使用@classmethod装饰器定义。

class Times(object): factor = 1 @classmethod def mul(cls, x): return cls.factor * x

class TwoTimes(Times): factor = 2

Times.mul(3) 3 TwoTimes.mul(3) 6

TwoTimes是Times的子类,但在调用mul时cls为TwoTimes,所以cls.factor为2。
<h2>4.特性</h2>
特性是一种特殊的属性,访问它时会计算他的值,和c#中的属性类似,使用@property装饰器定义。

class Circle(object): def init(self, r): self.radius = r @property def area(self): return math.pi * self.radius ** 2 @property def perimeter(self): return 2 * math.pi * self.__radius

@property def radius(self): return self.radius @radius.setter def radius(self, value): if not isinstance(value, float): raise TypeError(‘Must be a float’) self.radius = value @radius.deleter def radius(self): self.__radius = 0

c = Circle(3.0) c.radius 3.0 c.area 28.274333882308138 c.perimeter 18.84955592153876

赋值

c.radius = 4.0 c.radius 4.0

删除

del c.radius c.radius 0

当定义了特性后,只能简单访问该特性,要做赋值和删除操作的话必须附加setter和deleter方法。
<h2>5.运算符重载</h2>
和c++一样,Python也可以对运算符进行重载。可以重载的方法如下表所示。
<table>
  <tr><th>Method</th><th>Overloads</th><th>Call for</th></tr>
  <tr><td>__init__</td><td>构造函数</td><td>X=Class()</td></tr>
  <tr><td>__del__</td><td>析构函数</td><td>对象销毁</td></tr>
  <tr><td>__repr__</td><td>打印转换</td><td> print X,repr(X)</td></tr>
  <tr><td>__str__</td><td>打印转换</td><td> print  X,str(X)</td></tr>
  <tr><td>__call__</td><td>调用函数</td><td>X()</td></tr>
  <tr><td>__getattr__</td><td> 限制</td><td>X.undefine</td></tr>
  <tr><td>__setattr__</td><td>取值</td><td>X.any=value</td></tr>
  <tr><td>__getitem__</td><td>索引</td><td> X[key],For If</td></tr>
  <tr><td>__setitem__</td><td>索引</td><td> X[key]=value</td></tr>
  <tr><td>__len__</td><td>长度</td><td>len(X)</td></tr>
  <tr><td>__iter__</td><td>迭代</td><td><p>For In</p></td></tr>
  <tr><td>__add__ </td><td>+ </td><td>X+Y,X+=Y</td></tr>
  <tr><td>__sub__</td><td>-</td><td>X-Y,X-=Y</td></tr>
  <tr><td>__mul__</td><td>*</td><td>X*Y</td></tr>
  <tr><td>__radd__</td><td>右加+ </td><td> +X</td></tr>
  <tr><td>__iadd__</td><td>+=</td><td>X+=Y</td></tr>
  <tr><td>__or__</td><td>|</td><td>X|Y,X|=Y</td></tr>
  <tr><td>__cmp__</td><td>比较 ==</td><td>X==Y,X<Y</td></tr>
  <tr><td>__lt__</td><td>小于<</td><td>X<Y</td></tr>
  <tr><td>__eq__</td><td>等于=</td><td>X=Y</td></tr>
</table>

class Number(object): def init(self, value): self.value = value # 加重载 def add(self, other): return Number(self.value + other.value) # 打印重载 def str(self): return ‘The value is %d.’ % self.value # 比较重载 def cmp(self, other): return cmp(self.value, other.value)

x = Number(1) y = Number(2) print x + y The value is 3. x > y False x < y True ```

作者:wuyuan 本文来自Wuyuan's Blog 转载请注明,谢谢! 文章地址: https://wuyuans.com/2013/05/python-class