# 内置函数

# 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>
'''

# 知识点总结