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))
<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-->查找
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,165评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,503评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,295评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,589评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,439评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,342评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,749评论 3 387
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,397评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,700评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,740评论 2 313
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,523评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,364评论 3 314
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,755评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,024评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,297评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,721评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,918评论 2 336

推荐阅读更多精彩内容