12 面向对象基础-1

2018-07-31  本文已影响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).属性:
(2).方法:
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()
上一篇下一篇

猜你喜欢

热点阅读