# 内置函数
# enumerate()
对于一个可迭代的(iterable)/ 可遍历的对象(如列表、字符串),enumerate 将其组成一个索引序列,利用它可以同时获得索引和值
enumerate 多用于在 for 循环中得到计数
enumerate(sequence, [start=0])
参数
- sequence -- 一个序列、迭代器或其他支持迭代对象。
- start -- 下标起始位置。
返回值
返回 enumerate (枚举) 对象。
实例
>>>seasons = ['Spring', 'Summer', 'Fall', 'Winter'] | |
>>> list(enumerate(seasons)) | |
[(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')] | |
>>> list(enumerate(seasons, start=1)) # 下标从 1 开始 | |
[(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')] |
# 类和对象
# 类的声明
在上面中实例代码中, self.name
是实例属性,习惯上传入的参数和实例属性的名称相同。
组成类名的每个单词的首字母大写,其余小写。
python 中一切皆对象(有内存空间)
class Student: | |
pass | |
if __name__ == '__main__': | |
print(id(Student)) | |
print(type(Student)) | |
print(Student) | |
''' | |
2552299205856 | |
<class 'type'> | |
<class '__main__.Student'> | |
类对象 | |
''' |
在类之外定义的叫函数,在类里定义的叫函数
静态方法和类方法又区别吗?
静态方法用 @staticmethod
修饰,且不允许用 self
做参数;类方法用 @classmethod
修饰,且又 cls 作为参数。
# 对象的创建
class Student: | |
def eat(self): | |
print('对象在吃饭') | |
if __name__ == '__main__': | |
stu = Student() | |
# 下面两行代码效果相同 | |
stu.eat() # 对象名。方法名 () | |
Student.eat(stu) # 类名。方法名 (对象) 实际是方法定义处的 self |
# 知识点总结
# 面向对象
面向对象的三大特征和语言是没有关系的。
# 封装
class Student: | |
def __init__(self, name, age): | |
self.name = name | |
self.__age = age | |
if __name__ == '__main__': | |
stu = Student("张三", 20) | |
print(stu.name) # 张三 | |
# print (stu.__age) # 报错 | |
print(dir(stu)) | |
print(stu._Student__age) # 20 |
# 继承
只是继承 object
时可以不用写
# 方法重写
# object 类
# 多态
# 特殊方法和属性
以两个下划线开始和结束
调用 __dict__
时,如果是类对象,则返回的是属性和方法的字典;如果是实例对象,则返回是属性字典。
对象名.__class__ 输出对象所属的类 | |
类名.__bases__ 输出父类类型的元组 | |
类名.__base__ 输出继承时离得最近的基类 | |
类名.__mro__ 输出类的层级结构 | |
类名.__subclasses__() 输出子类的列表 |
len 是内置函数
class Person(object): | |
def __new__(cls, *args, **kwargs): | |
print('__new__被调用执行了,cls的id值为{0}'.format(id(cls))) | |
obj = super().__new__(cls) | |
print('创建的对象的id为{0}'.format(id(obj))) | |
return obj | |
def __init__(self, name, age): | |
print('__init__被调用了,self的id值为{0}'.format(id(self))) | |
self.name = name | |
self.age = age | |
print('object这个类对象的id为:{0}'.format(id(object))) | |
print('Person这个类对象的id为:{0}'.format(id(Person))) | |
# 创建 Person 类的实例对象 | |
p1 = Person('张三', 20) | |
print('p1这个Person类的实例对象的id为:{0}'.format(id(p1))) | |
''' | |
object这个类对象的id为:140719082033104 | |
Person这个类对象的id为:2179670718016 | |
__new__被调用执行了,cls的id值为2179670718016 | |
创建的对象的id为2179634557760 | |
__init__被调用了,self的id值为2179634557760 | |
p1这个Person类的实例对象的id为:2179634557760 | |
在__new__中创建的对象obj就是self和p1, | |
''' |
# 深拷贝和浅拷贝
class CPU: | |
pass | |
class DISK: | |
pass | |
class Computer: | |
def __init__(self, cpu, disk): | |
self.cpu = cpu | |
self.disk = disk | |
# 变量赋值 | |
cpu1 = CPU() | |
cpu2 = cpu1 | |
print(cpu1, id(cpu1)) | |
print(cpu2, id(cpu2)) | |
''' | |
<__main__.CPU object at 0x000002544E5486D0> 2561114670800 | |
<__main__.CPU object at 0x000002544E5486D0> 2561114670800 | |
''' |
class CPU: | |
pass | |
class DISK: | |
pass | |
class Computer: | |
def __init__(self, cpu, disk): | |
self.cpu = cpu | |
self.disk = disk | |
cpu1 = CPU() | |
disk1 = DISK() | |
computer1 = Computer(cpu1, disk1) | |
import copy | |
computer2 = copy.copy(computer1) | |
print(computer1, computer1.cpu, computer1.disk) | |
print(computer2, computer2.cpu, computer2.disk) | |
''' | |
<__main__.Computer object at 0x0000024953B585E0> <__main__.CPU object at 0x0000024953B586D0> <__main__.DISK object at 0x0000024953B58130> | |
<__main__.Computer object at 0x0000024953CDF400> <__main__.CPU object at 0x0000024953B586D0> <__main__.DISK object at 0x0000024953B58130> | |
''' |
class CPU: | |
pass | |
class DISK: | |
pass | |
class Computer: | |
def __init__(self, cpu, disk): | |
self.cpu = cpu | |
self.disk = disk | |
cpu1 = CPU() | |
disk1 = DISK() | |
computer1 = Computer(cpu1, disk1) | |
import copy | |
computer3 = copy.deepcopy(computer1) | |
print(computer1, computer1.cpu, computer1.disk) | |
print(computer3, computer3.cpu, computer3.disk) | |
''' | |
<__main__.Computer object at 0x0000026FDB2285E0> <__main__.CPU object at 0x0000026FDB2286D0> <__main__.DISK object at 0x0000026FDB228130> | |
<__main__.Computer object at 0x0000026FDB3AF4F0> <__main__.CPU object at 0x0000026FDE7B1370> <__main__.DISK object at 0x0000026FDE7B1430> | |
''' |