美文网首页
12 面向对象基础-1

12 面向对象基础-1

作者: 卅月 | 来源:发表于2018-07-31 19:34 被阅读0次

    生成器(扩展)

    生成器可以看做是一个容器.当程序需要对应的数据的时候才去里面拿取数据,生成器中数据只能一个一个生成,不能跳过,一个数据只生成一次,已生成的数据无法再生成.
    数据的获取:    _ _ next _ _()方法
    注:1.只要函数声明中有yield关键字,则函数就变成了一个生成器.

    1. 生成器和其他数据容器不同,生成器保存在内存空间里的是产生数据的算法,并没有存储具体的数据,使得它占用空间很小.
      实例:利用生成器生成一个斐波那契数列
    def xu_lie(n):
        pre1 = 1
        pre2 = 1
    
        for i in range(1, n+1):
            if i == 1 or i == 2:
                current = 1
                yield current
            else:
                pre1, pre2 = pre2, current
                yield current
    
    xulie = xu_lie(10)
    
    print(xulie.__next__())
    print(xulie.__next__())
    print(xulie.__next__())
    
    # 1
    # 1
    # 2
    

    1.面向对象的基本概念

    (1)基于面向对象的编程, 面对问题考虑有没有相应的对象来解决这个问题 --> 工具: 类和对象
    (2)类: 对拥有共同属性和方法的对象的封装.类是抽象的.(比如:人类)
    (3)对象:对象就是类的具体实例,是具体的事物.而且对象的属性是确定的 (比如:一个叫小明的人类)

    2.声明类和对象

    (1)声明类

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

    注意:

    • 类的命名首字母要大写
    • 括号里为要继承的父类,默认为空
    • 属性:对象的属性,或者是类的字段
    • 方法:就是在类里面声明函数,实现某种功能
        def eat(self):
            print(self, '在吃饭')
    
        def sleep(self):
            print(self, '在睡觉(¦3[▓▓] 晚安')
    

    对象方法默认都有一个self参数,这个参数在方法被调用的时候不用传参(系统会自动传参),谁来调用这个方法,那self就指向谁.

    (2)声明对象

    对象名 = 类名()
    

    即通过类的构造方法去创建一个对象, 生成的对象可以使用xx.xx语法使用类中声明的对象的方法和属性

    3.对象的属性

    对象的属性的声明

    class 类名:
        def __init__(self,参数1, 参数2,参数...):
        self.属性名 = 初值
        self.属性2 = 初值2
    

    _ _ init _ _():方法是初始化对象的属性,是系统自带的方法,再通过构造方法创建对象的时候除了self,其他参数都必须有值.

    class People:
        def __init__(self, name1='', age1=0, sex1='女'):
            # 在这个地方声明对象的属性
            print('---')
            print(name1)
            # 在init方法中声明对象的属性
            """
            name,age,和sex就是Person这个类的对象属性.类的对象属性,需要通过对象来使用
            """
            self.name = name1
            self.age = age1
            self.sex = sex1
            self.flag = '1'
    

    4.对象属性的增删改查

    class Dog:
        """狗类"""
        def __init__(self, age='0', color='color'):
            self.age = age
            self.color = color
    
    dog1 = Dog(3, 'white')
    

    (1).查

    # 方法一:
    dog1.age, dog1.color
    # 方法二:
    dog1.__getattribute__('age')
    # 方法三:
    getattr(dog1, 'age')    # getattr(对象,属性名,默认值(默认值可以防止报错,可省略))
    

    (2).改

    # 方法一:
    dog1.color = 4
    # 方法二:
    dog1.__setattr__('color', 'black')
    # 方法三:
    setattr(dog1, 'color', 'blue')
    

    (3).增

    # 方法1:
    dog1.name = '大黄'
    # 方法2:
    dog1.__setattr__('type', '哈士奇')
    # 方法三:
    setattr(dog1, 'sex', '公')
    

    (4)删

    # 方法1:
    del dog1.age
    # 方法2:
    dog1.__delattr__('age')
    # 方法三:
    delattr(dog1, 'color')
    

    5.slots魔法

    slots可以对对象的属性进行限制(约束),防止后面给对象添加的属性写错了.
    slots一般写在开头类的声明的下面一行
    如果在后面给对象添加一个slots以外的属性,则会报错.

    class Person:
        __slots__ = ('name', 'age', 'sex')
    

    以上说明:Person类,只能有name,age,sex三个属性,如果在后面给对象添加属性的时候不在slots里,则会报错.

    6.类中的方法

    (1).属性:
    • a.类的属性:累的属性声明在类里面,函数外面,类的属性属于类,类的字段通过类调用
    • b.对象的属性:对象的属性写在init方法里面,通过对象调用
    (2).方法:
    • a.对象的方法:自带一个self参数,一般通过对象去调用
    • b.类的方法:
      (1)使用@classmethod修饰,自带一个cls参数(同self原理),不用传参,谁来调用这个方法,这个cls指向谁
      (2)每新建一个类方法,就需用@classmethod要修饰一次.
      (3)类方法就要通过类去调用
    • c.静态方法:
      (1)使用@classmethod修饰
      (2)没有默认参数
      (3)调用的时候,是通过类来调用的
      实例:
    class Person:
        # number是类字段
        number = 0
    
        def __init__(self, name='', age=0):
            # name 和 age是对象属性
            self.name = name
            self.age = age
    
        def eat(self, food):
            print('%s正在吃%s' % (self.name, food))
    
        @classmethod
        def hurt_earth(cls):
            # cls指向的是调用这个方法的类,cls可以当成类来使用
            print('人类破坏环境!!!')
    
            # 使用cls创建对象
            pt = cls()
            print(pt)
    
            # 也可以通过cls使用类的字段
            print(cls.number)
    
        @staticmethod
        def protect():
    
            print('人类保护地球')
    
    
    if __name__ == '__main__':
        # 类的属性,通过类来使用
        print(Person.number)
    
        # 对象的属性,通过对象来使用
        p1 = Person('小明')
        print(p1.name, p1.age)
    
        # 对象的方法要通过对象来使用
        p1.eat('南瓜')
    
        # 类的方法要通过类来使用
        Person.hurt_earth()
    
        # 静态方法通过类来调用
        Person.protect()
    

    相关文章

      网友评论

          本文标题:12 面向对象基础-1

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