|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 向西而笑 于 2017-8-26 21:18 编辑
36课时:给大家介绍对象
对象的基本概念封装:把乱七八糟的东西扔到列表里就是数据层面的封装,把常用的代码段打包成一个函数就是语句层面的封装。对象就是两者的合二为一,即把数据和代码封装在一起,是一种更高级别的封装。
对象 = 属性 + 方法
属性即静态的特征,方法即动态的特征。在实际的编程中,属性是变量,方法是函数。
类和对象的关系两者犹如模具和模具制作出来的东西。一个类为他的全部对象给出了统一的定义,而他的每个对象则是符合这个定义的实体。因此类和对象的关系就是抽象和具体的关系。比如我们定义了一个‘猫类’,那么‘猫’实例化的对象有:波斯猫、Tom(猫和老鼠动画片)叮当猫、HelloKitty、黑猫警长......
类的属性定义应该尽可能地抽象,因为这样更符合面向对象的思维。
例子:
- >>> class Cat:
- #属性定义
- legs = 4 #四条腿
- tail = True #有尾巴
- skil = ('climb tree','catch rat') #技能有爬树、抓老鼠
- #方法定义
- def voice(self):
- print('喵~喵~')
- def duty(self):
- print('那有只老鼠,又是一顿美味的大餐...')
-
-
- >>> tom = Cat()
- >>> tom.voice()
- 喵~喵~
- >>> tom.duty()
- 那有只老鼠,又是一顿美味的大餐...
- >>> tom.legs
- 4
- >>> tom.tail
- True
复制代码
上面的例子里先定义了一个类—Cat,这个类有三条属性和两个方法。
然后我在把这个类给实例化,tom也拥有了Cat的属性和方法。
面向对象的几个特征:封装性、继承性和多态性
封装性:对外部隐藏对象的工作细节。
继承性:子类自动共享父类属性和方法的机制。
举例:
- >>> class My_list(list):
- pass
-
- >>> list2 = My_list()
- >>> list2.extend([4,3,6,5,2,1])
- >>> list2
- [4, 3, 6, 5, 2, 1]
- >>> list2.sort()
- >>> list2
- [1, 2, 3, 4, 5, 6]
复制代码
上例中新的子类My_list继承了父类list,所以拥有list所有的属性和方法,所以实例化的list2能够使用list的extend()和sort()方法。
多态性:可以对不同对象调用相同的方法,得到不同的结果。
举例:
- >>> class Tiger:
- def run(self):
- print('随风奔跑自由是方向....')
- >>> class Lion:
- def run(self):
- print('追逐闪电和雷的力量...')
- >>> t = Tiger()
- >>> l = Lion()
- >>> t.run()
- 随风奔跑自由是方向....
- >>> l.run()
- 追逐闪电和雷的力量...
复制代码
上例中t和l都调用了run()方法,却得到不同的结果这就是多态性的体现。
37课时:面向对象编程
类方法中的self参数在类中的方法定义中都要定义一个self参数,这有什么作用呢?相当于C里面的this指针,当类实例化后调用方法使得程序知道是哪个对象调用的。举例:
- >>> class Ball:
- def setName(self,name):
- self.name = name
- def kick(self):
- print('我叫%s,卧槽,谁踢我...'%self.name)
-
-
- >>> a = Ball()
- >>> a.setName('球A')
- >>> a.kick()
- 我叫球A,卧槽,谁踢我...
- >>> b = Ball()
- >>> b.setName('土豆')
- >>> b.kick()
- 我叫土豆,卧槽,谁踢我...
复制代码
python的魔法方法魔法方法就是可以给你的类增加“魔力”的特殊方法,如果你的对象实现了这些方法中的某一个,那么这个方法就会在特殊的情况下被调用,而这一切是自动发生的......这些魔法方法是被双下划线包围,如__init__,__eq__......
__init__(self):我们把这个特殊方法称作构造方法。实例化对象是可以传入参数的,这些参数会自动的传入到__init__方法中(__init__(self,param1,param2...))我们可以重写这个方法来自定义对象的初始化操作。例如:
- >>> class Ball:
- def __init__(self,name):
- self.name = name
- def kick(self):
- print('我叫%s,该死的,谁踢我...'%self.name)
-
-
- >>> b = Ball('土豆')
- >>> b.kick()
- 我叫土豆,该死的,谁踢我...
复制代码
上例实例化对象b时传入了一个参数‘土豆’,所以调用kick()方法时显示了传入的参数。还可以设置默认参数,这样可以直接调用kick()方法,如:
- >>> class Ball:
- def __init__(self,name='呃,我是个球'):
- self.name = name
- def kick(self):
- print('我叫%s,该死的,谁踢我...'%self.name)
-
-
- >>> c = Ball()
- >>> c.kick()
- 我叫呃,我是个球,该死的,谁踢我...
复制代码
公有和私有
python里的属性和方法默认是公有的。在Python中定义私有变量只要在变量名或函数名前加上’__’两个下划线,那么这个函数或变量就变成私有的了。
例子:
- >>> class Person:
- name = '小甲鱼'
- >>> p = Person()
- >>> p.name
- '小甲鱼'
- >>> class Person:
- __name = '小甲鱼'
- >>> p = Person()
- >>> p.name
- Traceback (most recent call last):
- File "<pyshell#8>", line 1, in <module>
- p.name
- AttributeError: 'Person' object has no attribute 'name'
复制代码
上面的例子加上了__就不能访问name这个属性了。但是还是有办法访问的,其实程序是在__变量前面加上了_类名,变成了_类名__变量名
- >>> class Person:
- __name = '小甲鱼'
- >>> p = Person()
- >>> p._Person__name
- '小甲鱼’
复制代码
|
评分
-
查看全部评分
|