菜单

面向对象编程

2011年03月14日 - Python

一、类基础

1、类的定义

class <类名>:

<其他语句>

class <类名>(父类名):

<其他语句>

Python代码
  1. >>> class human:
  2. …     age=0
  3. …     sex=”
  4. …     name = ”
  5. >>> class student(human):
  6. …     school = ”
  7. …     number = 0
  8. …     grade = 0
  9. >>>

 

2、类的使用

如果直接使用类名修改其属性,那么将影响已经实例化的对象。

 

Python代码  收藏代码
  1. >>> class A:
  2. …     name = ‘A’
  3. …     num = 2
  4. >>> A.name
  5. ‘A’
  6. >>> a = A()       #实例化a对象
  7. >>> a.name
  8. ‘A’
  9. >>> A.name = ‘B’
  10. >>> A.name
  11. ‘B’
  12. >>> a.name
  13. ‘B’
  14. >>>

 

二、类的属性和方法

1、类的属性:

如果类的属性是以两条下划线开始则该属性为类的私有属性,不能在类外部被访问。

私有属性的命名形式: __privateAttrs

 

如果在类内部的方法中使用类的私有属性,则应该以如下方式调用。

self.__privateAttrs

Python代码  收藏代码
  1. >>> class book:
  2. …     __author = ”
  3. …     __name = ”
  4. …     __page = 0
  5. …     price = 0
  6. >>> a = book()
  7. >>> a.__author
  8. Traceback (most recent call last):
  9. File “<stdin>”, line 1, in <module>
  10. AttributeError: book instance has no attribute ‘__author’
  11. >>> a.price
  12. 0
  13. >>>

2、类的方法

在类的内部使用def关键字可以为类定义一个方法。与函数定义不同的是,类的方法必须包含参数 ‘self ’ ,

且’self’必须为第一个参数。和类的私有属性命名相同,类的私有方法名也要以两条下划线开始。

Python代码  收藏代码
  1. >>> class book:
  2. …     __author = ”
  3. …     __name = ”
  4. …     __page = 0
  5. …     price = 0
  6. …     def show(self):
  7. …             print self.__author
  8. …             print self.__name
  9. …     def setname(self,name):
  10. …             self.__name = name
  11. >>> a = book()
  12. >>> a.show()
  13. >>> a.setname(‘Tom’)
  14. >>> a.show()
  15. Tom
  16. >>>

 

在python中有一类以两条下划线开始并且以两条下划线结束的类方法,称之为专有方法。

__init__  构造函数,生成对象时调用

__del__  析构函数,释放对象时调用

__add__ 加运算

__mul__  乘运算

__cmp__ 比较运算

__repr__ 打印、转换

__setitem__ 按照索引赋值

__getitem__ 按照索引获取值

__len__ 获得长度

__call__ 函数调用

Python代码  收藏代码
  1. >>> class book:
  2. …     __author = ”
  3. …     __name = ”
  4. …     __page = ”
  5. …     price = 0
  6. …     def __check(self,item):
  7. …             if item == ”:
  8. …                     return 0
  9. …             else:
  10. …                     return 1
  11. …     def show(self):
  12. …             if self.__check(self.__author):
  13. …                     print self.__author
  14. …             else:
  15. …                     print ‘No value’
  16. …             if self.__check(self.__name):
  17. …                     print self.__name
  18. …             else:
  19. …                     print ‘No value’
  20. …     def setname(self,name):
  21. …             self.__name = name
  22. …     def __init__(self,author,name):
  23. …             self.__author = author
  24. …             self.__name = name

三、类的继承

1)单继承

Python代码  收藏代码
  1. >>> class parent:
  2. …     __a = ”
  3. …     __b = 0
  4. …     def __init__(self,a,b):
  5. …             self.__a = a
  6. …             self.__b = b
  7. …     def show(self):
  8. …             print self.__a
  9. …             print self.__b
  10. >>> a = parent(‘a’,2)
  11. >>> a.show()
  12. a
  13. 2
  14. >>> class child(parent):
  15. …     __c = ”
  16. …     __d = 4
  17. …     def showinfo(self):
  18. …             self.show()
  19. >>> b = child(‘c’,3)
  20. >>> b.show()
  21. c
  22. 3
  23. >>> b.showinfo()
  24. c
  25. 3
  26. >>>

2)多重继承

Python代码  收藏代码
  1. # -*- coding:utf-8 -*-
  2. class A:       #定义类A
  3. name = ‘A’
  4. __num = 1
  5. def show(self):
  6. print self.name
  7. print self.__num
  8. def setnum(self,num):
  9. self.__num = num
  10. class B:        #定义类B
  11. nameb = ‘B’
  12. __numb = 2
  13. def show(self):
  14. print self.nameb
  15. print self.__numb
  16. def setname(self,name):
  17. self.__name = name
  18. class C(A,B):
  19. def showall(self):
  20. print self.name
  21. print self.nameb
  22. show = B.show      #在这里表明show方法为B类的show方法,后来修改加上的
  23. >>> import jicheng
  24. >>> a = jicheng.A()
  25. >>> a.show()
  26. A
  27. 1
  28. >>> c = jicheng.C()
  29. >>> c.showall()
  30. A
  31. B
  32. >>> c.show()  #默认调用A类的show方法
  33. A
  34. 1
  35. >>> reload(jicheng)   #修改jicheng.py后重新加载
  36. <module ‘jicheng’ from ‘jicheng.py’>
  37. >>> d =jicheng.C()
  38. >>> d.show()
  39. B
  40. 2
  41. >>>

五)重载

1)方法的重载实际上就是在类中使用def关键字重载父类的方法。如果重载父类中的方法,但又需要

在类中使用父类的该方法,可以使用父类名加‘ .’加方法名的形式调用。

Python代码  收藏代码
  1. # -*- coding:utf-8 -*-
  2. class Mylist:
  3. __mylist = []
  4. def __init__(self,*args):
  5. self.__mylist = []
  6. for arg in args:
  7. self.__mylist.append(arg)
  8. def __add__(self,n):            #重载‘+’运算符
  9. for i in range(0, len(self.__mylist)):
  10. self.__mylist[i] = self.__mylist[i] + n
  11. def show(self):
  12. print self.__mylist
  13. >>> import chongzai
  14. >>> L = chongzai.Mylist(1,2,3,4,5)
  15. >>> L.show()
  16. [1, 2, 3, 4, 5]
  17. >>> L + 2
  18. >>> L.show()
  19. [3, 4, 5, 6, 7]
  20. >>>

发表评论

电子邮件地址不会被公开。 必填项已用*标注