12 面向对象基础-1
2018-07-31 本文已影响0人
卅月
生成器(扩展)
生成器可以看做是一个容器.当程序需要对应的数据的时候才去里面拿取数据,生成器中数据只能一个一个生成,不能跳过,一个数据只生成一次,已生成的数据无法再生成.
数据的获取: _ _ next _ _()方法
注:
1.只要函数声明中有yield
关键字,则函数就变成了一个生成器.
- 生成器和其他数据容器不同,生成器保存在内存空间里的是产生数据的算法,并没有存储具体的数据,使得它占用空间很小.
实例:利用生成器生成一个斐波那契数列
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()