Python 入门之路 (14)
属性和方法
• 属性
• 类属性,直接在类中定义的属性是类属性
• 类属性可以通过类或类的实例访问到。但是类属性只能通过类对象来修改,无法通过实例对象修改
• 实例属性 通过实例对象添加的属性属于实例属性
• 实例属性只能通过实例对象来访问和修改,类对象无法访问修改
• 方法
• 在类中定义,以self为第一个参数的方法都是实例方法
• 实例方法在调用时,Python会将调用对象以self传入
• 实例方法可以通过类实例和类去调用
• 当通过实例调用时,会自动将当前调用对象作为self传入
• 当通过类调用时,不会自动传递self,我们必须手动传递self
• 类方法 在类的内容以@classmethod 来修饰的方法属性类方法
• 类方法第一个参数是cls 也会自动被传递。cls就是当前的类对象
• 类方法和实例方法的区别,实例方法的第一个参数是self,类方法的第一个参数是cls
• 类方法可以通过类去调用,也可以通过实例调用
• 静态方法
• 在类中用@staticmethod来修饰的方法属于静态方法
• 静态方法不需要指定任何的默认参数,静态方法可以通过类和实例调用
• 静态方法,基本上是一个和当前类无关的方法,它只是一个保存到当前类中的函数
• 静态方法一般都是些工具方法,和当前类无关
class A:
# 类属性 直接在类中定义的属性
# 类属性只能通过类对象修改,无法通过实例对象来修改
count = 0
def __init__(self):
# 实例属性 是通过实例对象添加的属性
# 实例属性只能通过实例对象来访问和修改,类对象无法访问和修改
self.name = '葫芦娃'
# 实例方法 在类中定义,以self为第一个参数的方法都是实例方法
def test(self):
print('这是test方法...')
# 类方法 类方法和实例方法的区别,实例方法的第一个参数是self,类方法的第一个参数是cls
# 类方法第一个参数是cls 也会自动被传递。cls就是当前的类对象
# 类方法以@classmethod 来修饰的方法
# 类方法可以通过类调用,也可以通过实例调用
@classmethod
def test2(cls):
print('这是test方法,它是一个类方法')
print(cls.count)
# 静态方法 基本上都是一个与本类无关的方法,用@staticmethod来修饰的方法属于静态方法
# 静态方法不需要指定任何的默认参数,静态方法可以通过类和实例调用
# 静态方法一般都是些工具方法,和当前类无关
@staticmethod
def test3():
print('是test方法,它是一个静态方法')
a = A()
# 实例属性,通过实例对象添加的属性称为实例属性
a.count = 20
print(A.count) # 0
print(a.count) # 20
print(‘A’,A.name)
print('a',a.name)
a.test()
A.test(a) # 用类对象去调用实例方法,需要传递实例化对象,否则不知道找哪个实例的方法
A.test2()
a.test2()
模块
模块化将一个完整的程序分成一个个小模块
通过模块组合搭建一个完整的程序
模块化的优点;
- 方便开发
- 方便维护
- 模块复用
模块的创建
在Python当中一个py文件就是一个模块
在一个模块中引入外部模块,可以引入同一个模块多次,但是模块的实例只会执行一次
- import 模块名
模块名就是Python的文件名 - import 模块名 as 模块别名
在一个模块内部都有一个__name__,通过print(name)可以获取模块的名字(不在主文件中运行);
如果print(name)在py文件直接运行时,那么__name__默认等于字符串’main’。__name__属性值为__main__的模块是主模块。一个程序中只有一个主模块
模块的使用
访问模块中的变量–>模块名.变量名
访问模块中的函数–>模块名.函数名
访问模块中的对象–>模块名.对象名
我们也可以引入模块中部分内容
from 模块名 import 变量,变量…
还有一种引入方式
from 模块名 import 变量 as 别名
列表推导式
旧的列表 —> 新的列表
语法:
[表达式 for 变量 in 旧的列表]
[表达式 for 变量 in 旧的列表 if 条件]
# 找到长度大于3的人名
lst = ['jerry','tony','tom','mok','abcd']
def fn(lst):
new_lst = []
for name in lst:
if len(name) > 3:
new_lst.append(name)
# 找到长度大于3的人名
lst = ['jerry','tony','tom','mok','abcd']
r = [name.capitalize() for name in lst if len(name)>3]
print(r)
# 1-100能被3整除的列表
new_lst = [n for n in range(1,101) if i %3 ==0]
print(new_lst)
生成器
有一种一边循环一边计算的机制,称为生成器
创建生成器的方法
- 通过列表推导式
# 需求: 得到一个0-10之间的数,并和3相差的列表
# new_lst = [i * 3 for i in range(10)]
# print(new_lst)
g = (i * 3 for i in range(10))
print(type(g)) # <class 'generator'>
print(g) # <generator object g at ox---->
# 方式一 __next__() 获得元素
print(g.__next__()) # 0
print(g.__next__()) # 3
# 方式二 next()函数 获取元素
print(next(g)) # 6
print(next(g)) # 9
print(next(g)) # 12
print(next(g)) # 15
# 当所有元素均生成后继续再调用会报错
- 通过函数来完成
只要在函数中添加yield关键字,该函数就会变成一个生成器
a. 定义一个函数,函数中使用yield关键字
b. 调用函数,接收调用结果
c. 得到的结果就是一个生成器
d. 通过next()和__next__()就可以获取生成器的元素
def fn():
n = 0
while True:
n += 1
yield n
n = fn()
print(n) # <generator object g at ox---->
print(next(n)) # 1
print(next(n)) # 2