Day_12 类和对象

迭代器和生成器

生成器:可以看成是一个可以存储多个数据的容器,需要数据的时候
生成一个。里面的数据只能从前往后一个一个生成,不能跳跃,也不饿从后往前
生成后的数据不能再生成
获取生成器里面的数据需要使用__next__()方法

只要在函数申明中有yield关键字,函数就不再是一个单独的函数
而是变成一个生成器-保存一个有规律的容器

和列表比较:列表存数据,一个数据会占一定的内存空间
生成器存数据,存的是产生数据的算法

def xu_lie(n):
    pre_1 =1
    pre_2 =1
    for x  in range(1,n+1):
        if x ==1 or x==2:
            curent=1
            yield curent
            continue
        curent =pre_1+pre_2
        pre_1,pre_2=pre_2,curent
    # print(curent)
        yield curent

xulie = xu_lie(10)
print(xulie.__next__())
print(xulie.__next__())
print(xulie.__next__())
print(xulie.__next__())

1
1
2
3

if __name__ == '__main__':
    list1 = [12,23,4,5,56]
    x = (i for i in list1)
    # x就是一个生成器,用来产生数据
    print(x.__next__())
    print(x.__next__())
    y = (j for j in range(10) if j%2==0)
    print(y.__next__())
    print(y.__next__())
    print(y.__next__())
12
23
0
2
4
def fun(n):
    if n ==1:
        a = 1
        return  a
        yield a
print(fun(1))

def list_d(n):
    x =0
    while x<=n:
        yield x
        x +=1
lis = list_d(10)
print(lis.__next__())
print(lis.__next__())
0
1

面向对象

1.什么是类:对拥有相同属性和方法的对象的封装

2.什么是对象:对象就是类的实例

3.面向对象编程
面向过程编程:一步一步的写代码实现功能--工具:逻辑和算法
函数式编程:面对问题考虑有没有拥有某种功能的函数 工具:函数
面向对象编程:面对问题考虑相应的对象来解决问题-->类和对象

4.类的申明

class 类名:
    属性
    方法
class 类名(父类)

类名:标识符,类名首字母大写,驼峰式名 MySum
类名():类要继承自其它的类,括号里面是父类的名字
属性:对象属性和类的字段--保存数据
方法:申明在类中的函数---实现功能

class Person:
    """
    类的说明
    """
创建方法时,默认有参数self,通过对象调用时不用传参
系统会自动传一个参数,哪个对象调用方法,self就是指向那个对象
的地址

def eat(self):
    print('在吃饭')
    print(self)
def sleep(self):
    print('(:3[▓▓]快醒醒开学了')
if __name__ == '__main__':
    # 申明对象
    # 对象名=类名()
    #通过类的构造方法去创建对象,构造方法(名字和类名同名的方法)
    a = Person()
    print(a)
    a.eat()
    a.sleep()
    #类对象可以同.使用类中申明的方法和属性
    #对象.方法() 对象.属性名

对象的属性

# 对象属性的申明
'''
class 类名:
    def __init__(self):
        self.属性名1 = 初值1
        self.属性名2 = 初值2


'''
class Person:
    # init方法时系统自带的一个方法,这个方法不能直接调用
    # 通过类创建对象的时候,系统会自动调用这个方法
    # init方法的作业是对对象的属性进行初始化
    # 通过构造方法创建对象的时候一定要保证init方法中除了self外,其他的每个参数都必须有值

    def __init__(self,name,age,sex):
        # 在init中申明对象的属性
        # print('aaa',name)
        self.name = name
        self.age = age
        self.sex = sex
        #类的对象属性,需要通过对象来使用




if __name__ == '__main__':
    # 构造方法的参数实质是传个init方法的参数的
    a = Person('付波','24','男')
    print('%s是个%s的单身%s'%(a.name,a.age,a.sex))


#对象增删查改
"""__author__== God"""

class Dog:
    def __init__(self,species,color,age=3):
        self.species = species
        self.color = color
        self.age = age



if __name__ == '__main__':
    # 查,如果属性不存在 报错
    dog1 = Dog('德牧','黑背','2')
    print('my god is%s,it\'s color '
          'is %s,and it\'s%s yeras old'%(dog1.species,dog1.color,dog1.age))
    # 其他查看属性的方法
    # 对象.__getattribute__('属性名')
    # getattr(对象名,'属性名')

    print(dog1.__getattribute__('age'))
    print(getattr(dog1,'age'))
    # 修改
    dog2 = Dog('金毛','yellwo')
    dog2.age = 1
    #对象.__setattr__(属性名,'新值')
    dog2.__setattr__('species','法斗')
    #setattr(对象,属性名,新值)
    setattr(dog2,'color','white')
    print(dog2.color)
    print(dog2.age)
    print(dog2.species)

    #增加
    #属性是添加给对象的,而不是类
    dog2.sex = '0'
    print(dog2.sex)
    #
    dog2.__setattr__('food','狗粮')
    print(dog2.food)
    setattr(dog2,'hobby','sleep')
    print(dog2.hobby)




    #删除
    #删除对象属性
    '''
    del 对象.属性 
    删除属性是删除具体某个对象的属性,不会影响类的其他对象
    '''
    del dog1.age
    dog1.__delattr__('species')
    delattr(dog1,'color')

练习

class Student:
    def __init__(self,name,age,sex):
        self.name = name
        self.age = age
        self.sex = sex

    def study(self):
        print('%s study day day up'%self.name)

if __name__ == '__main__':
    student1 = Student('李祥',19,'男')
    print('学生1的名字是%s,今年%d岁了,单身老%s人'%(student1.name,student1.age,student1.sex))
    student1.study()
    print(student1.__getattribute__('name'))
    print(getattr(student1,'age'))

    student1.__setattr__('name','程李明')
    print(student1.name)
    setattr(student1,'sex','0')
    print(student1.sex)

写一个班级类,属性:班级名、学生;功能:添加学生、删除学生、根据姓名查看学生信息,展示班级的所有学生信息

from random import randint
class Student:
    def __init__(self,name,age,id,sex):
        self.name = name
        self.age = age
        self.sex = sex
        self.id = id
    def __str__(self):
        return str('name is %s,age is %d,id is %s,sex is %s'%(self.name,self.age,self.id,self.sex))



class Class:
    def __init__(self,name='',students=[]):
        self.class_name = name
        self.students = students
    def add_student(self):
        name = input('student\'name')
        age = input('student\'age')
        sex = input('student\'sex')
        id = 'py1805'+str(randint(1,100)).rjust(3,'0')
        # 根据输入的信息创建学生对象
        stu = Student(name,int(age),id,sex)
        #添加学生 self得到Class的对象属性
        self.students.append(stu)

    def check_student(self):
        input_info = input('input the student\'s name or id')
        for item in self.students:
            if input_info == item.name or input_info == item.id:
                print(item)
    def check_all_student(self):
        for item in self.students:
            print(item)
    def del_student(self):
        input_info = input('input the student\'s name or id')
        for item in self.students[:]:
            if input_info == item.name or input_info == item.id:
                self.students.remove(item)


# cls1 = Class('py1805')
# cls1.add_student()
# print(cls1.students[0])
# cls1.check_student()
# cls1.del_student()
# print(cls1.students)

while True:
    print('*'*50)
    clsone = Class('py1805')
    print('1.添加学生\n2.查找学生\n3.删除学生\n4.查看所有学生\nq.退出')
    choose = input('>>>')
    if choose=='1':
        while True:
            clsone.add_student()
            print('1.继续添加\n2.返回上级')
            choose1 = input('>>>')
            if choose1 !='1'or choose1=='2':
                break
            continue

    elif  choose=='2':
        while  True:
            clsone.check_student()
            print('1.继续查看\n2.返回上级')
            choose2 = input('>>>')
            if choose2 != '1' or choose2 == '2':
                break
            continue
    elif choose =='3':
        while True:
            clsone.del_student()
            print('1.继续删除\n2.返回上级')
            choose3 = input('>>>')
            if choose3 != '1' or choose3 == '2':
                break
            continue
    elif choose=='4':
        while True:
            clsone.check_all_student()
            print('1.返回上级')
            choose4 = input('>>>')
            if choose4==1:
                break
            break
    else:
        break

slots魔法
class Person(object):
    # __slots__=(属性名)的功能:约束类中的属性。使对象只能对()有的属性进行操作
    __slots__ = ('name','age','sex')
    def __init__(self,name,age):
        self.name =name
        self.age =age
    def __str__(self):
        # 自定义对象的打印格式
        # id():是Python的内置函数,功能是获取变量的地址
        return str(hex(id(self)))

if __name__ == '__main__':
    p1 = Person('李祥',20)
    p1.name = '猪打野'
    p1.sex = '男'
    print(p1.name)
    print(p1.sex)
    print(p1)
    p2 = Person('d4lx',20)
    print(p2)


类中方法
'''
属性:对象的属性、类的属性(类的字段)
对象属性的特点:属于对象的,不同的对象对应的值可能不一样(通过对象来使用)
类的字段:申明在类中,函数外面。类属性属于类(类的字段,通过类来使用)

方法:对象方法(方法)、类方法、静态函数
对象方法:自带一个self参数,一般通过对象调用
类方法:@classmethod关键字下的函数是类方法
语法:cls是系统自带参数,并且这个参数不用传参
@classmethod
def fun1(cls):
    pass

静态函数:使用@staticmethod修饰,没有默认参数,通过类调用
语法:
@staticmethod
def fun2():
    pass
静态函数没有默认参数

怎么选择用对象方法、类方法、静态方法
如果实现函数的功能需要使用对象的属性,就申明成对象方法 
如果实现函数的功能需要使用类的字段,或者调用类的方法,就声明成类方法
如果实现函数的功能既不需要对象的属性,也不需要类的字段,就申明成静态方法
class Person:
    # number是类字段,只能通过类使用 Person.number
    number = 0
    @classmethod
    # cls指向的是调用这个方法的类,cls可以当成类来使用
    def hurt_earth(cls,name):
        print('%s最牛逼。。。。'%name)
        pt = cls('张三')
        # 使用cls创建对象
        print(pt.name)
        print(cls.number)
        #可以通过cls使用类的字段
    @classmethod
    def fun1(cls):
        print('天下第一。')
    @staticmethod
    def fun2():
        print('吹牛逼。')
    def __init__(self,name='',age=0):
        # name和age都是对象属性
        self.name = name
        self.age = age
    # 对象方法
    def eat(self,food):
        print('%s在吃%s'%(self.name,food))


if __name__ == '__main__':
    # 类的字段通过类来使用
    print(Person.number)
    # 对象的属性通过对象使用
    print(Person().name)
    p1 = Person('aa',18)
    # 对象调对象方法
    p1.eat('shit')
    print(Person('bb',18).eat('shit'))
    # 类调用类方法
    Person.hurt_earth('老子')
    Person.fun1()
    # 静态方法通过类来调用
    Person.fun2()

# pycharm快捷键 ctrl+r-->查找替换
# Ctrl+f-->查找

你可能感兴趣的:(Day_12 类和对象)