美文网首页
Day_12 类和对象

Day_12 类和对象

作者: FansYuercero | 来源:发表于2018-07-31 20:44 被阅读0次
    迭代器和生成器

    生成器:可以看成是一个可以存储多个数据的容器,需要数据的时候
    生成一个。里面的数据只能从前往后一个一个生成,不能跳跃,也不饿从后往前
    生成后的数据不能再生成
    获取生成器里面的数据需要使用__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))
    <generator object fun at 0x7f747ba46360>
    
    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 类和对象

          本文链接:https://www.haomeiwen.com/subject/hghkvftx.html