`

python学习笔记8——第七章 面向对象

阅读更多

第七章  更加抽象——面向对象

 

1. 面向对象的特点——多态,封装,继承

 

   对象:包括特性和方法,特性只是作为对象的一部分变量,而方法则是存储在对象内的函数。

 

(1)多态——对不同类的对象,使用同样操作。不知道对象到底是什么类型,但又要对对象做一些操作

   很多内置的函数和运算符都是多态的

   不用关注x到底是什么类型,都可以使用count函数,另外还有repr(),连接符+等

>>> x = 'string'  #x是字符串
>>> x.count('s')
1
>>> x = ['1', '2', '1']  #x是列表
>>> x.count('1')
2

 

(2)封装——对外部世界隐藏对象的操作细节

(3)继承——以普通类为基础建立专门的类对象

 

2. 创建类

   对于python来说,方法就分两种一种是绑定的,一种是不绑定。属于类的方法就是绑定的,普通的函数就是不绑定的

   除了静态类,其他类的方法定义时都需要有一个self参数,而调用时不需要,self类似java/c++里的this,不是指类本身,而是指实例本身。

 

   类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的第一个参数名称,但是在调用这个方法的时候你 为这个参数赋值,Python会提供这个值。这个特别的变量指对象本身,按照惯例它的名称是self

   self原理:举例说明,有一个类A,A的实例a,a.method(arg1,arg2)这时python自动转A.method(a,arg1,arg2),这也意味着如果你有一个不需要参数的方法,你还是得给这个方法定义一个self 参数。

 

   python没法显式的说哪个属性是自己的,而且属性还可以动态的增加,此时,一个解决方案出来了,增加self,通过self.访问的就可以做为类的属性。

>>> _metaclass_ =  type #确定使用新类
>>> class Person:
	def setName(self, name):  #相当于this,代表Person对象自身
		self.name = name
	def getName(self):
		return self.name
	def greet(self):
		print "Hello, world! I'm %s." %self.name

#运行		
>>> foo = Person()
>>> bar = Person()
>>> foo.setName('Luke')  #相当于给实例foo,添加了一个attribute: name
>>> bar.setName('Anakin')
>>> foo.greet()
Hello, world! I'm Luke.
>>> bar.greet()
Hello, world! I'm Anakin.
>>> foo.name  #特性可在外部访问
'Luke'
>>> Person.getName(foo) #效果同上
'Luke'
>>> bar.name = 'Yoda'  #特性也可在外部直接修改,类似bar.setName('Yoda')
>>> bar.greet()  #等价于Person.greet(bar)
Hello, world! I'm Yoda.

 

   将属性绑定到普通函数上

>>> class MyClass:
	def method(self):
		print "I have a self!"

		
>>> def function():
	print "I don't..."

	
>>> c = MyClass()
>>> c.method()
I have a self!
>>> c.method = function  #将属性绑定到普通函数
>>> c.method()
I don't...
 

3. 私有属性、方法——Python并没有真正的私有化支持,但可用下划线得到伪私有


   尽量避免定义以下划线开头的变量

   (1)_xxx      "单下划线 " 开始的成员变量叫做保护变量,意思是只有类对象(即类实例)和子类对象自己能访问到这些变量,需通过类提供的接口进行访问;不能用'from module import *'导入


    (2)__xxx    类中的私有变量/方法名 (Python的函数也是对象,所以成员方法称为成员变量也行得通。),"下划线 " 开始的是私有成员,意思是只有类对象自己能访问,连子类对象也不能访问到这个数据。

 

    (3)__xxx__ 系统定义名字,前后均有一个“双下划线” 代表python里特殊方法专用的标识,如 __init__()代表类的构造函数。

 

   __开头的本来就是表示private,private是不可继承的

 

    python有私有的定义方法就是在变量或者方法的面前加上双下滑线__,但是实际上这是python的伪私有。只是一种程序员约定俗称的规定,加了就表示私有变量,但是如果要在外部调用的话,还是可以调用的,调用方法如下:

   所有以双下划线开始的变量,都被python翻译为前面加上单下划线和类名

如__inaccessible 翻译为 Secretive._Secretive__inaccessible,注意第一个为单下划线,第二个为双下划线

 

>>> class Secretive:
	def __inaccessible(self):  #双下划线表示私有方法
		print "Bet you can't see me..."
	def accessible(self):
		print "The secret message is:"
		self.__inaccessible()

		
>>> s = Secretive()
>>> s.__inaccessible() #私有方法从外界是无法访问的

Traceback (most recent call last):
  File "<pyshell#89>", line 1, in <module>
    s.__inaccessible() #私有方法从外界是无法访问的
AttributeError: Secretive instance has no attribute '__inaccessible'
>>> s.accessible()  #私有方法只能在类内部使用
The secret message is:
Bet you can't see me...
>>> s._Secretive__inaccessible()  #虽然私有,仍能调用,伪私有机制
Bet you can't see me...

 

4. 类的命名空间——class语句中的代码都在特殊的命名空间中执行

 

   类的定义区并不只限定使用def语句

>>> class C:
	print 'Without def...'

#运行	
Without def...

 

   计算类的实例数量

>>> class MemberCounter:
	members = 0
	def init(self):
		MemberCounter.members += 1 #属于整个类的属性members,计算类的实例数量,而不用self.members,实例的属性

		
>>> m1 = MemberCounter()
>>> m1.init()
>>> MemberCounter.members
1
>>> m1.members
1
>>> m2 = MemberCounter()
>>> m2.init()
>>> MemberCounter.members
2
>>> m2.members  #类作用于内的变量,可以被所有实例访问
2
>>> m1.members
2
>>> m2.members = 'test' #重绑定members,相当于新添加了与类里的members相同的同名变量,从而屏蔽了类范围内的变量
>>> m2.members
'test'
>>> m1.members  #不变
2
>>> MemberCounter.members
2

 

5. 继承

   格式:A是父类,B是子类,B继承A

   class A:

   class B(A):

>>> class Filter:
	def init(self):
		self.blocked = []
	def filter(self, sequence):
		return [x for x in sequence if x not in self.blocked]

	
>>> class SPAMFilter(Filter): #继承Filter
	def init(self): #重写Filter父类中的init方法
		self.blocked = ['SPAM']

		
>>> f = Filter()
>>> f.init()
>>> f.filter([1, 2, 3])
[1, 2, 3]
>>> 
>>> s = SPAMFilter()
>>> s.init()  #调用子类重写的方法
>>> s.filter(['SPAM', 'TEST', 'SPAM', 'test']) #调用从父类继承来的方法
['TEST', 'test']

 

   调查继承

   issubclass(A,B):查看类A是否是类B的子类

>>> issubclass(SPAMFilter, Filter)
True
>>> issubclass(Filter, SPAMFilter)
False

 

   若想知道某个类的基类,使用特殊属性__bases__,注意为“双下划线”

>>> SPAMFilter.__bases__
(<class __main__.Filter at 0x011A62D0>,)
>>> Filter.__bases__
()
 

   isinstance(A,B):对象A是否是类B的实例

>>> s = SPAMFilter() #既是子类的实例又是父类的实例
>>> isinstance(s, SPAMFilter)  #s是子类的直接实例(成员)
True
>>> isinstance(s, Filter)  #s是父类的间接实例
True
>>> isinstance(s, str) #isinstance对类型也起作用,如str是字符串类型
False

 

   若想知道对象属于哪个类的实例,使用特殊属性__class__,注意为“双下划线”

>>> s.__class__
<class __main__.SPAMFilter at 0x011A6480>

 

6. 多重继承

   子类TalkingCalculator不作任何事,它从父类中继承所有的行为,从Calculator中继承calculate方法,从Talk中继承talk方法。

>>> class Calculator:
	def calculate(self, expression):
		self.value = eval(expression)

		
>>> class Talker:
	def talk(self):
		print "Hi, my value is", self.value

		
>>> class TalkingCalculator(Calculator, Talker):
	pass

>>> tc = TalkingCalculator()
>>> tc.calculate('1 + 2 * 3')
>>> tc.talk()
Hi, my value is 7

 

    注意超类顺序,先继承的类中的方法会重写后继承的类中的方法

    假设C继承A和B,而A和B中有同名方法,如method

   class C(A, B):,A中的method重写B中的method

   class C(B, A):,B中的method重写A中的method,所以如果想使用B中的method方法,则将B放在前面

 

7. 接口和内省——公开的方法和属性

 

   检查所需方法(特性)是否存在

>>> hasattr(tc, 'talk')
True
>>> hasattr(tc, 'test')
False

 

   检查方法是否可调用

>>> hasattr(getattr(tc, 'talk', None), '__call__')
True
>>> hasattr(getattr(tc, 'test', None), '__call__')
False

    getattr()允许提供默认值,以便当方法不存在时使用。

    与getattr()相对的是setattr()用来设置对象特性

>>> setattr(tc, 'name', 'Mr. Gumby')
>>> tc.name
'Mr. Gumby'
 

总结:

   random.choice(seq) : 从非空序列中随机选择元素

>>> from random import choice
>>> choice([1, 2, 3])
1

 

   type(object):返回对象类型

>>> type('test')
<type 'str'>
>>> type(1)
<type 'int'>
 

 

 

分享到:
评论

相关推荐

    Python学习笔记.pdf

    **标题与描述解析:** "Python学习笔记.pdf" 的标题直接指出了文档的主题——Python的学习资料,而描述的重复表明该文档的主要内容即为Python的学习笔记。标签 "Python" 进一步强调了主题。 **知识点:** 1. **...

    【精品分享】《Python编程从入门到实践》学习笔记——第二章 变量和简单数据类型

    第九章“类”引入面向对象编程的概念,第十章“文件和异常”涉及读写文件和处理程序运行时可能出现的问题。 通过这个系列的学习,你将逐步掌握Python的基础,为更高级的编程概念打下坚实基础。记得实践是检验真理的...

    python入门笔记-李金(强烈推荐).zip

    **Python入门笔记——李金详解** 本篇笔记是基于作者李金的《python入门笔记-李金(强烈推荐)》的解析,旨在为初学者提供一份详尽的Python语言学习指南。这份笔记采用Jupyter Notebook的形式,使得学习过程更加...

    python——大作业.zip

    本压缩包"python——大作业.zip"包含了Python学习过程中的笔记和作业,旨在帮助用户复习巩固Python基础知识,并通过实践提升编程技能。 在Python的学习中,基础知识点主要包括以下几个方面: 1. **语法基础**:...

    Python学习 —— 代码&amp;笔记(年11月30日、12月1日).zip

    【Python学习 —— 代码&笔记(年11月30日、12月1日)】 这篇笔记主要涵盖了在11月30日和12月1日期间进行的Python学习内容,其中包括了基本语法、数据结构、控制流程、函数、模块化编程等多个重要知识点。以下是...

    python -0基础笔记(csdn)————程序.pdf

    6. **面向对象**:Python支持面向对象编程,提供了类和对象的概念。 7. **交互式**:Python解释器允许用户直接运行代码片段,方便测试和调试。 ### 第一章:计算机基础知识 计算机由硬件和软件两大部分组成。硬件...

    python基础教程-学习笔记.zip

    这份“Python基础教程——学习笔记”涵盖了Python编程的基础知识,旨在帮助初学者快速入门。 1. **变量与数据类型** Python中的变量无需预先声明,可以直接赋值。支持的数据类型包括整型(int)、浮点型(float)...

    全套百度云教程:python基础+进阶+项目篇 (含Django和Tornado)

    1. **面向对象编程**:类与对象的概念、继承、多态性、封装等。 2. **文件操作**:读写文件、文件路径管理。 3. **正则表达式**:掌握基本的正则表达式规则及应用。 4. **网络编程**:Socket编程、HTTP协议等。 5. *...

    《“笨办法”学Python》的读书笔记和编程习题.zip

    10. **面向对象编程**:Python支持面向对象编程,理解类和对象的概念,以及继承、封装和多态性,有助于编写更复杂的应用。 通过《“笨办法”学Python》的习题,你可以逐步巩固这些概念,并通过实践提升编程技能。...

    note:学习笔记

    6. **面向对象编程**:Python支持面向对象编程,包括类(class)的定义、对象的创建以及继承、封装和多态等概念。例如,`class Person: def __init__(self, name): self.name = name`定义了一个Person类。 7. **...

    Py101-Spring-15:Python 101 Class Spring 2015 in NAU

    此外,课程还会涉及面向对象编程,以及如何使用Python进行文件操作、网络编程和数据分析等进阶主题。 1. **基础语法**:Python的语法简洁清晰,注重可读性。学生将学习如何声明和使用变量,理解整型、浮点型、字符...

    scrimba-python:带有Scrimba的Python 101 https:scrimba.comlearnpython

    【标题】"scrimba-python:带有Scrimba的Python 101" 提供了一个学习Python编程的在线平台——Scrimba。Scrimba是一个交互式的学习平台,以其独特的“时间旅行”功能著称,它允许用户在观看教学视频的同时进行代码...

    Estudando-Python:只是为了好玩-Curso em Video https://www.cursoemvideo.com

    5. **面向对象编程**:理解类、对象、继承、封装和多态等概念,这是Python中的核心特性。 6. **模块和包**:学习如何组织代码,使用内置模块(如math、os、sys)以及安装和导入第三方模块。 7. **异常处理**:掌握...

    北京邮电大学《软件工程》期末考试试卷期末复习资料.pdf

    8. 软件工程方法论:理解面向对象、面向服务、面向切面、函数式编程等不同的编程范式和方法论。 9. 软件工程工具:熟悉UML工具、版本控制工具(如Git)、项目管理工具(如JIRA)和持续集成工具(如Jenkins)的使用...

    verbose-octo-journey

    然后可以进一步学习面向对象编程、异常处理、文件操作、正则表达式、网络编程、多线程和异步I/O等进阶概念。Python的强大在于其丰富的第三方库,如NumPy和Pandas用于数据科学,Django和Flask用于Web开发,TensorFlow...

    lesson-7

    在IT学习的道路上,每一课都是一个新的里程碑,而"第7课"——"lesson-7",无疑是我们深化理解、拓宽知识视野的关键一步。在这个阶段,我们可能将深入探讨计算机科学的一些核心概念,或者接触一些实用的技术工具和...

Global site tag (gtag.js) - Google Analytics