- 类提供了一种组合数据和功能的方法。有自己的属性,也有改变自己熟悉感的方法
1.名称和对象
- 在python中,对象具有个性,多个名称可以绑定到同一个对象。在其他语言中称为别名。对可变对象影响巨大。
2.作用域和命名空间
- 命名空间是一个从名字到对象的映射
- 不同命名空间中的名称之间绝对没有关系
- 包含内置名称的命名空间在模块定义被读入时创建,永远不会被删除;模块命名空间持续到解释器退出;一个函数的本地命名空间在这个函数被调用时创建,在函数返回或抛出异常时被删除。
- 最先搜索的最内部作用域包含局部名称
从最近的封闭作用域开始搜索的任何封闭函数的范围包含非局部名称,也包括非全局名称
倒数第二个作用域包含当前模块的全局名称
最外面的范围(最后搜索)是包含内置名称的命名空间
3.初探类
- 属性引用 .
class MyClass:
"""A simple example class"""
i=12345
def f(self):
return 'hello world'
- 实例化
x=MyClass()
#创建新的类实例并将此对象分配给局部变量x
当一个类定义了__ init __()方法时,类的实例化操作会自动为新创建的类实例发起调用 __ init __()。相当于初始构造函数。
-方法对象与函数对象
方法中,方法所属对象会作为第一个参数被传入,后可跟其他参数
- 类变量与实例变量。在类中直接定义的变量是类变量,此时若该变量数据类型为可变对象,那么从该类实例化出的对象共享该变量。在类的方法中赋值的变量,为实例变量
- 以下,tricks为可变数据类型,且为类变量
class Dog:
tricks=[]
def __init__(self,name):
self.name=name
def add_trick(self,trick):
self.tricks.append(trick)
d=Dog('Fido')
e=Dog('Buddy')
d.add_trick('roll over')
e.add_trick('play dead')
print(d.tricks)
print(e.tricks)
class Dog:
def __init__(self,name):
self.name=name
self.tricks=[]
#实例变量,初始化时给实例化的对象的
def add_trick(self,trick):
self.tricks.append(trick)
d=Dog('Fido')
e=Dog('Buddy')
d.add_trick('roll over')
e.add_trick('play dead')
print(d.tricks)
print(e.tricks)
4.补充说明
- 数据属性会覆盖掉具有相同名称的方法属性。
- 数据属性可以被方法以及一个对象的普通用户所引用
- 可将一个函数对象赋值给一个局部变量
5.继承
class DerivedClassName(BaseClassName):
...
...
- 构造类对象时,基类会被记住。当请求属性时,在类中先找,然后在基类中寻找,递归进行。
-多重继承:一个类继承自多个基类
6.私有变量
在python中不存在仅限从一个对象内部访问的私有实例变量。通常带有一个下划线_a
- 名称改写
任何形式为 __spam 的标识符(至少带有两个前缀下划线,至多一个后缀下划线)的文本将被替换为 _classname__spam,其中 classname 为去除了前缀下划线的当前类名称。 这种改写不考虑标识符的句法位置,只要它出现在类定义内部就会进行。
8.迭代器
- for语句会调用容器对象中的iter()。该函数返回一个定义了__ next __()方法的迭代器对象,该方法将逐一访问容器中的元素,元素用尽时,引发StopIteration异常来通知终止for循环
>>> s = 'abc'
>>> it = iter(s)
>>> it
<iterator object at 0x00A1DB50>
>>> next(it)
'a'
>>> next(it)
'b'
>>> next(it)
'c'
>>> next(it)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
next(it)
StopIteration
9.生成器
yield表达式
生成器:用于创建迭代器的简单而强大的工具。写法类似标准的函数,不同的是使用yield语句。返回的就是一个迭代器!!