1、面向对象最重要的概念就是类(Class)和实例(Instance),必须牢记类是抽象的模板,比如Student类,而实例是根据类创建出来的一个个具体的“对象”,每个对象都拥有相同的方法,但各自的数据可能不同。
2、以看到,变量bart指向的就是一个Student的实例,后面的0x10a67a590是内存地址,每个object的地址都不一样,而Student本身则是一个类。
可以自由地给一个实例变量绑定属性
3、Python特性
编程范式 编译类
脚本 动态
4、面向对象意味着面向对象。 换句话说,它意味着功能上针对建模对象。 这是用于通过数据和行为描述一系列交互对象来为复杂系统建模的众多技术之一
5、面向对象编程(OOP)的主要支柱是继承,多态,抽象和封装。
6、为什么选择面向对象编程?
清晰的程序结构、由于每个对象都是独立存在的、代码库提供了一个很好的框架,供程序员轻松修改和修改提供的组件、便于维护和修改现有的代码。
7、基于程序的编程源于基于功能/过程/例程概念的结构编程。 在面向程序的编程中访问和更改数据很容易。
面向对象编程(Object Oriented Programming,OOP)允许将问题分解成多个称为对象的单元,然后在这些对象周围构建数据和函数。 它比过程或功能更强调数据。
在OOP中,数据也是隐藏的,不能被外部程序访问。
8、想要使编程语言成为面向对象,它应该有一种机制来支持类和对象的使用,以及基本的面向对象原则和概念的实现和使用,即继承,抽象,封装和多态。
9、Python编程的核心是对象和OOP,但是您不需要通过将代码组织到类中来限制自己使用OOP。 OOP增加了Python的整个设计理念,并鼓励一种干净而实用的编程方式。 面向对象还可以编写更大更复杂的程序。
10、模块就像“字典”,在使用模块时,请注意以下几点 -
Python模块是封装可重用代码的包。
模块存储在一个有__init__.py文件的文件夹中。
模块包含功能和类。
模块使用import关键字导入。
11、可通过使用以下过程来处理模块 -
模块是一个包含一些函数或变量的Python文件。
导入需要的文件。
现在,可以使用.(点)运算符访问该模块中的函数或变量。
12、请注意,Python中有常见的模式 -
以一个key = value风格的容器
通过键的名称获取某些内容
将模块与字典进行比较时,两者都是相似的,除了以下内容 -
在字典的情况下,键是一个字符串,语法是[key]。
在模块的情况下,键是一个标识符,语法是.key。
13、类就像模块
模块是一个专门的字典,可以存储Python代码,所以你可以用.操作符来获得它。 类是一种对函数和数据进行分组并将其放置在容器中的方式,以便您可以使用.操作符访问它们。
对象就像小型的模块
一个类就像一个迷你版本的模块,可以用类似的方式导入类,就像使用类实例一样。 请注意,当实例化一个类时,会得到一个对象。
您可以实例化一个对象,类似于像函数一样调用一个类
14、列表(List)代表了Python中最通用的数据结构类型。
列表是一个容器,它在方括号中包含逗号分隔的值(项目或元素)。
当我们想要处理多个相关的值时,列表很有用。
当列表将数据保存在一起时,我们可以一次对多个值执行相同的方法和操作。
列表索引从零开始,与字符串不同,列表是可变的。
空的对象
空对象是最简单和最基本的Python内置类型。
多次使用它们而没有注意到并将它扩展到我们创建的每个类。
编写一个空类的主要目的是暂时阻止某些东西,然后扩展并向其添加行为。
15、元组
元组与元素类似,可以存储元素。
但是,它们是不可变的,所以不能添加,删除或替换对象。
元组提供的主要好处是因为它的不变性,可以将它们用作字典中的键,或者在对象需要散列值的其他位置使用它们。
元组用于存储数据,而不是行为。
如果需要行为来操作元组,则需要将元组传递到执行操作的函数(或另一个对象上的方法)。
定义一个元组
元组与元素列表非常相似,只是整个元素集包含在圆括号中而不是方括号中。
就像当对一个列表进行切片时一样,会得到一个新的列表,当对一个元组进行切片时,会得到一个新的元组。
16、字典中不能有重复的键。 更改现有键的值将删除旧值。
可以随时添加新的键值对。
字典在元素之间没有顺序的概念,它们是简单的无序集合。
17、从上面的代码可以观察到 -
字典值可以是任何数据类型,包括字符串,整数,包括字典本身。
与字典值不同,字典的键更受限制,但可以是任何类型的字符串,整数或任何其他类型。
del - 允许通过键从字典中删除单个项目。
clear - 从字典中删除所有项目
18、集合
Set()是一个没有重复元素的无序集合。
虽然单个项目是不可变的,但设置本身是可变的,
也就是说可以添加或删除组中的元素/项目。
可以执行像联合,交叉等数学运算。
19、通过将所有项目(元素)放置在大括号{}内,
用逗号或使用内置函数set()分隔来创建一个集合。
20、讨论类包时,以下几点需要注意 -
行为(behavior)与函数相同 - 它是一段执行某些操作(或实现行为)的代码,
状态(state)与变量相同 - 它是一个在类中存储值的地方。
当声明一个类的行为和状态时,它是一个类包函数和变量。
21、在类中定义的函数称为方法。 实例方法需要一个实例才能调用它并且不需要装饰器。 创建实例方法时,第一个参数始终为self。 尽管可以用其他名称来调用它(self),但建议使用self,因为它是一个命名约定。
22、封装
面向对象编程在很大程度上依赖于封装。
简化并使得在不知道内部结构的情况下使用对象变得容易理解。
任何更改都可以很容易地管理。
封装提供了限制访问某些对象组件的机制,这意味着对象的内部表示无法从对象定义的外部看到。 访问这些数据通常是通过特殊方法来实现的 - Getters 和 Setters 。
这些数据存储在实例属性中,可以在类以外的任何位置进行操作。 为了保护它,只能使用实例方法访问该数据。 不应允许直接访问。
23、
对象就像小型的模块
一个类就像一个迷你版本的模块,可以用类似的方式导入类,就像使用类实例一样。 请注意,当实例化一个类时,会得到一个对象。您可以实例化一个对象,类似于像函数一样调用一个类
class MyClass(object):
def setAge(self, num):
self.age = num
def getAge(self):
return self.age
zack = MyClass()
zack.setAge(45)
print(zack.getAge())
zack.setAge("Fourty Five")
print(zack.getAge())
24、 只有在数据正确且有效的情况下,才能使用异常处理结构来存储数据。 正如我们上面所看到的,用户对setAge()
方法的输入没有限制。 它可以是字符串,数字或列表。 因此,我们需要检查上面的代码以确保存储的正确性。
25、__init __()
方法可以有单个或多个参数,以获得更大的灵活性。 init
代表初始化,因为它初始化实例的属性。 它被称为类的构造函数。
class myclass(object):
def __init__(self,aaa, bbb):
self.a = aaa
self.b = bbb
x = myclass(4.5, 3)
print(x.a, x.b)
26、
在类中定义的属性称为“类属性”,并且在函数中定义的属性称为“实例属性”。 在定义的时候,这些属性并不是以self
为前缀的,因为这些属性是类的属性,而不是特定实例的属性。
类属性可以通过类本身(className.attributeName
)以及类的实例(inst.attributeName
)来访问。 因此,这些实例可以访问实例属性以及类属性。
简而言之,类属性对于类的所有实例都是相同的,而实例属性对于每个实例都是特定的。 对于两个不同的实例,将有两个不同的实例属性。
27、Python内置函数
(1)len()
函数获取字符串,列表或集合的长度。 它返回对象的项目的长度或数量,其中对象可以是字符串,列表或集合。
但是,在实践中,我们更顷向于使用len()
而不是__len __()
函数,原因如下 -
-
它更高效。 并且写一个特定的方法来拒绝访问诸如
__len__
这样的特殊方法是没有必要的。 -
它易于维护。
-
它支持向后兼容性。
(2)Reversed(seq)方法
它返回反向迭代器。 seq
必须是具有__reversed __()
方法或支持序列协议(__len __()
方法和__getitem __()
方法)的对象。 当我们想从后到前循环项目时,它通常用于循环。
枚举enumerate()
方法向iterable
添加一个计数器并返回枚举对象。enumerate()
的语法是 -
enumerate(iterable, start = 0)
Python
这里第二个参数起始是可选的,默认情况下索引从零开始(0)。
因此·enumerate()·返回一个迭代器,它产生一个元组,用于保持传递的序列中元素的计数。 由于返回值是一个迭代器,直接访问它并没有多大用处。 enumerate()
的更好方法是将计数保持在for
循环中。
标准库中还有许多其他功能,下面是另一些更广泛使用的功能列表 -
-
hasattr
,getattr
,setattr
和delattr
,它允许对象的属性由其字符串名称操作。 -
all
和any
,接受可迭代对象,如果所有或任何项目评估为真,则返回True
。 -
nzip
,它采用两个或多个序列并返回一个新的元组序列,其中每个元组包含每个序列的单个值。
28、文件I/O
文件的概念与术语面向对象编程相关。 Python封装了操作系统在抽象中提供的接口,使我们可以使用文件对象。
open()
内置函数用于打开文件并返回文件对象。 它是两个参数中最常用的函数
open()
函数调用两个参数,
第一个是文件名,第二个是模式。
这里的模式可以是只读模式的'r'
,只有写入的模式'w'
(同名的现有文件将被删除),'a'
打开要附加的文件,
任何写入文件的数据都会自动添加 到最后。 'r +'
打开文件进行读写。
默认模式是只读的。
在窗口中,模式附加的'b'
以二进制模式打开文件,所以也有'rb'
,'wb'
和'r + b'
等模式。
当打开一个文件进行读取,可以调用read
,readline
或readlines
方法来获取文件的内容。 read
方法将文件的全部内容作为str
或bytes
对象返回,具体取决于第二个参数是否为'b'
。
为了便于阅读,并且为了避免一次性读取大文件,通常最好直接在文件对象上使用for
循环。 对于文本文件,它将逐行读取每一行,并且可以在循环体内处理它。 但对于二进制文件,最好使用read()
方法读取固定大小的数据块,并传递参数以获取最大字节数。
>>> f = open('fileone','r+')
>>> f.readline()
'This is the first line. \n'
>>> f.readline()
'This is the second line. \n'
通过对文件对象的写入方法写入文件将向该文件写入一个字符串(二进制数据的字节)对象。 writelines
方法接受一系列字符串并将每个迭代值写入文件。 writelines
方法不在序列中的每个项目之后追加一个新行。
最后,在完成读取或写入文件时,应调用close()
方法,以确保将任何缓冲写入写入磁盘,文件已被正确清理,并将与该文件绑定的所有资源释放回操作系统。 调用close()
方法是一个更好的方法,但从技术上讲,这将在脚本存在时自动发生。
方法重载的替代方法
方法重载是指具有多个接受不同参数集的同名方法。
给定单个方法或函数,可以指定自己的参数数量。 根据函数定义,可以使用零个,一个,两个或多个参数来调用它。
函数也是对象
可调用对象是一个对象可以接受一些参数,并可能返回一个对象。 函数是Python中最简单的可调用对象,但也有其他类似于类或某些类实例。
Python中的每个函数都是一个对象。 对象可以包含方法或函数,但对象不是必需的函数。
可调用的对象
就像函数是可以在其上设置属性的对象一样,可以创建一个可以被调用的对象,就像它是一个函数一样。
在Python中,可以使用函数调用语法来调用带有__call __()
方法的任何对象。