Python-面向对象编程.ppt
《Python-面向对象编程.ppt》由会员分享,可在线阅读,更多相关《Python-面向对象编程.ppt(72页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、面向对象的一些基本概念和特征类类:用来描述具有相同属性和方法的对象的集合,它定义该集合中每个对象所共有的属性和方法,对象是类的实例。类变量类变量:类变量在整个实例化的对象中是公用的,类变量定义在类中且在函数体之外,类变量通常不作为实例变量使用。数据成员数据成员:类变量或者实例变量用于处理类及其实例对象的相关数据。方法重写方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override)。实例变量实例变量:定义在方法中的变量,只作用于当前实例的类。继承继承:即一个派生类(derived class)继承基类(base class)的字段和方法,继承也允许
2、把一个派生类的对象作为一个基类对象对待。实例化实例化:创建一个类的实例,类的具体对象。方法方法:类中定义的函数。对象对象:对象包括两类数据成员(类变量和实例变量)和方法,通过类定义的数据结构实例化。6.1 类的定义与使用 Python中的类是一个抽象的概念,比函数还要抽象。我们可以把它简单看做是数据以及由存取、操作这些数据的方法所组成的一个集合。那为什么还要用类来取代函数呢?类有如下优点: 类对象是多态的:也就是具有多种形态,这意味着我们可以对不同的类对象使用同样的操作方法,而不需要额外编写代码。 类的封装:类封装之后,可以直接调用类的对象来操作内部的一些类方法,不需要让使用者看到代码工作的细
3、节。 类的继承:类可以从其它类或者基类中继承它们的方法,直接使用。6.1.1 类的定义 类是对现实世界中一些事物的封装,所有类的开头都要包括关键字class,紧接着的是类名和冒号,随后是定义类的类体代码。语法格式如下:class ClassName: documentation string . . . . . . object是“所有类之父”。如果你的类没有继承任何其他父类,object将作为默认的父类,它位于所有类继承结构的最上层(继承的概念在本章稍后介绍),定义一个类可以采用下面的方式。【实例6-1】类的定义。class people: #定义基本属性 name = age = 0 #定
4、义私有属性,私有属性在类外部无法直接进行访问 _weight = 0 #定义构造方法 def _init_(self,n,a,w): self.name = n self.age = a self._weight = w #定义类本身的方法 def speak(self): print(%s is speaking: I am %d years old %(self.name,self.age)#类调用p = people(tom,10,30)p.speak() 注意:在上面的例子中,name和age是类的公有属性。_weight使用两个下划线开头,表示声明该属性为私有属性,它不能在类的外部被
5、使用或直接访问,但可以在类内部使用self. _weight调用。 【实例6-2】接上例。print(p.name)print(p._weight) 出错的原因在于,在类的外部使用了私有属性。6.1.2 类属性与方法 1.类的公有属性public_attrs:符合正常的变量命名规则,开头没有下划线,类外部可以直接进行访问。如上例中的name、age等。 2.类的私有属性_private_attrs:由两个下划线开头,声明该属性为私有,不能在类的外部被使用或直接访问。在类内部的方法中使用时的格式为self._private_attrs。【实例6-3】类的私有属性。class Counter: _
6、privateCount = 1 # 私有属性 publicCount = 1 # 公有属性 def count(self): self._privateCount += 1 self.publicCount += 1 print (self._privateCount)counter_1 = Counter()counter_1.count() # 打印数据print (counter_1.publicCount) # 打印数据print (counter_1._privateCount) # 报错,实例不能访问私有属性出错的原因在于,在类的外部使用了私有属性。 3.类的构造方法_init_
7、:叫作构造函数或者构造方法,它在生成一个对象时被自动调用。在上文的例子中p=people(tom,10,30)语句就是调用_init_方法将参数传递给self.name、self.age和self._weight。 4.类的公共方法public _method:在类的内部,使用def关键字可以为类定义一个方法,与一般函数定义不同,类方法必须包含参数self,且为第一个参数。self在Python里不是关键字,self代表当前对象的地址,类似于Java语言中的this。 5.类的私有方法_private_method:由两个下划线开头,声明该方法为私有方法,不能在类的外部调用。在类的内部调用时格
8、式为self._private_methods。【实例6-4】类的私有方法。class Site: def _init_(self, name, url): self.name = name # 公有属性 self._url = url # 私有属性 def printme(self): print(name : , self.name) print(url : , self._url) def _printme_1(self): # 私有方法 print(输出私有方法) def printme_1(self): # 公共方法 print(输出公共方法) self._printme_1()wz
9、 = Site(百度网址, )wz.printme() # 打印数据wz.printme_1() # 打印数据,调用私有方法_printme_1 ()wz._printme_1() # 报错,实例不能访问私有属性 出错的原因在于,实例不能访问私有方法。 6.单下划线(_)以单下划线开始的成员变量叫做保护变量,意思是只有类对象和子类对象自己能访问到这些变量,简单的模块级私有化只需要在属性名前使用一个单下划线字符。以单下划线开头(_ singlePrivate)的属性代表不能直接访问的类属性,需通过类提供的接口进行访问,这就防止模块的属性用“from mymodule import *”来加载,这
10、是严格基于作用域的,所以这同样适合于函数。 【实例6-5】下划线的使用。class Test(): def _init_(self): pass def public(self): print (这是公共方法) def _singlePrivate(self): print (这是单下划线方法) def _doublePrivate(self): print (这是双下划线方法)t = Test()t.public() # 可以调用t._singlePrivate() # 可以调用t._doublePrivate() # 出现错误 注意:f._ singlePrivate ()可以直接访问,不
11、过根据Python的约定,应该将其视作private,而不要在外部使用它们,良好的编程习惯是不要在外部使用它。同时,根据Python docs的说明,_object和_object的作用域限制在本模块内。 7.类的专有方法下面是Python常用的一些专有方法,如表6-1所示。 表6-1 类的专有方法专有方法专有方法专有方法说明专有方法说明_init_构造函数,在生成对象时调用_del_ 析构函数,释放对象时使用_repr_打印,转换_setitem_按照索引赋值_getitem_按照索引获取值_len_获得长度_call_函数调用_add_加运算_sub_减运算_mul_乘运算_div_除运算
12、_mod_求余运算_pow_乘方运算【例6-6】_del_和_repr_专有方法的使用。class Test: def _init_(self,name=None): self.name = name def _del_(self): print (hello world!) def _repr_(self): return Study(Jacky) def say(self): print (self.name) Test(Tim) #自动调用_del_方法s= Test(Tim)s.say()print(s) #自动调用_repr_方法print (Test(Kitty) #先自动调用_r
13、epr_方法,然后自动调用_del_方法 【实例6-7】_str_专有方法的使用。class Test: def _init_(self,number): self.a=number0:3 self.b=number3:6 def _str_(self): return “%s %s”%(self.a,self.b)def test(): num=Test(input(“请输入数字: n”) print (输入的数字是:,num)#执行脚本test()6.1.3 关于Python的作用域和命名空间。 1.作用域与命名空间的解释 作用域是指Python程序可以直接访问到的命名空间。“直接访问”在
14、这里意味着访问命名空间中的命名时无需加入附加的修饰符。命名空间本质上是一个字典,它的键就是变量名,它的值就是那些变量的值。Python使用命名空间来记录变量的轨迹。 在Python程序中的任何一个地方,都存在三个可用的命名空间: (1)每个函数都有自已的命名空间(称作局部命名空间),它记录了函数的变量,包括函数的参数和局部定义的变量。 (2)每个模块都有自已的命名空间(称作全局命名空间),它记录了模块的变量,包括函数、类、其它导入的模块、模块级的变量和常量。 (3)每个模块都有可访问的内置命名空间,它存放着内置函数和异常。 2.命名空间的查找顺序 (1)局部命名空间特指当前函数或类的方法。如果
15、函数中定义一个局部变量x,Python将使用这个变量,然后停止搜索。 (2)全局命名空间特指当前的模块。如果模块中定义名为x的变量、函数或类,Python将使用这个变量,然后停止搜索。 (3)内置命名空间对每个模块都是全局的,作为最后的尝试,Python将假设x是内置函数或变量。 (4)如果Python在这些命名空间中都找不到x,它将放弃查找并引发一个NameError异常,同时传递“There is no variable named x”这样一条信息。 当函数被调用时创建一个局部命名空间,我们可以通过globals()和locals()内建函数判断某一名字属于哪个名称空间。 locals(
16、)是只读的,globals()不是。 【实例6-8】locals()函数示例。def foo(arg, a): x = 1 y = abc for i in range(5): j = 2 k = i print (locals()#调用函数的打印结果foo(2,3) locals()实际上没有返回局部命名空间,它返回的是一个拷贝。所以对它进行改变对局部命名空间中的变量值并无影响。 【实例6-9】globals()函数示例。print(当前的全局命名空间:)var=globals()print(var) globals()函数返回实际的全局命名空间,而不是一个拷贝。所以对globals()函数
17、所返回的var的任何改动都会直接影响到全局变量。3.嵌套函数命名空间的查找步骤:(1)先在当前函数(嵌套的函数或lambda匿名函数)的命名空间中搜索。(2)然后在父函数的命名空间中搜索。(3)接着在模块命名空间中搜索。(4)最后在内建函数的命名空间中搜索。下面举例说明。 【实例6-10】嵌套函数命名空间示例。address = 地址: def func_country(country): def func_part(part): city= 天津 #覆盖父函数的part变量 print(address + country + city + part) city = 北京 #初始化city变量
18、 #调用内部函数 func_part(西青) #初始化part变量#调用外部函数func_country(中国 ) #初始化country变量 以上实例中,address在全局命名空间中,country在父函数的命名空间中,city、 part在子函数的命名空间中。6.2 Python类与对象 6.2.1类对象 类对象支持两种操作:属性引用和实例化。类对象的属性引用和Python中所有属性的引用一样,都使用标准的语法:obj.name。类对象创建之后,类命名空间中所有的命名都是有效属性名。 在Python中,方法定义在类的定义中,但只能被类对象的实例所调用。调用一个方法的途径分三步: 1.定义
19、类和类中的方法。 2.创建一个或若干个实例,即将类实例化。 3.用所创建的实例调用方法。 【实例6-11】类的定义与实例化。class MyClass: 一个简单的类实例 i = 12 def f(self): return hello world# 实例化类MyClass = MyClass()# 访问类的属性和方法print(MyClass 类的属性 i 为:, MyClass.i)print(MyClass 类的方法 f 输出为:, MyClass.f() 本例中,MyClass.i和MyClass.f()是有效的属性引用,分别返回一个整数和一个方法对象。也可以对类属性赋值,即可以通过给
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Python 面向 对象 编程
限制150内