2018-10-17day14对象介绍和相关操作
一、编程类型
1、面向过程编程:算法和逻辑(c语言),
2、函数式编程:将函数作为工具
3、面向对象编程:类和对象
二、类
1、什么是类
类:是拥有形同属性和相同功能的对象的集合,一般是抽象的
对象:就是类的实例,一般是具体的
2、类的声明
格式
class 类名(父类列表):
类的说明文档
类的内容
说明:
class :Python中声明类的关键字
类名:标识符,不能是关键字;类名使用驼峰命名,并且首字母大写
驼峰命名:如果由多个单词组成,第一个单词首字母小写,后面每个单词首字母大写
(userName)
PEP8:如果由多个单词组成,所有字母小写,多个单词之间用下滑线隔开
user_name
(父类列表):让声明的类继承括号中的父类。这个结构可以省略,让当前类继承Python的基类:object
后面的冒号固定写法
类的说明文档:就是注释,是对类进行说明
类的的内容:包含属性(变量)和方法(方法:就是声明在类中的函数)
声明Person类,吃饭和睡觉
class Person:
"""
人类
"""
def eat(self):
print('eat')
def sleep(self):
print('睡觉')
3、声明对象
-
语法:对象名 = 类名()
-
说明:
-
对象名:变量名
-
类名:必须是声明过的类
-
声明对象
per1 = Person() # 对象1
per2 = Person() # 对象2
三、对象方法
在类的内容包含属性和方法,方法分为对象方法、类方法、静态方法
1、对象方法:直接声明在类中的函数就是对象方法。对象方法都有一个默认参数self,需要通过对象来调用
调用语法:对象.方法名(参数列表)
注意:调用对象方法时不需要给self传参数,系统会自动将当前调用该方法的对象作为参数给self传参数。
self:谁调用当天前的对象方法,self就指向谁,也可以看成当前类的对象,也就是说对象能做的事,self也能做
class Person:
"""人类"""
# 对象方法
def eat(self):
print('eat')
per1 = Person()
per1.eat()
四、构造方法
1、构造方法就是函数名和类名一样的方法,作用是用来创建对象的。
声明类的时候,系统会自动为这个类创建构造方法
2、创建对象的过程:调用构造方法在内存中开辟空间创建对象,并且会自动调用init方法去对这个对象进行初始化,
最后将创建好的对象的地址返回
3、init方法
- 是对象方法
- 不需要手动调用,创建完对象后,会自动调用
class Dog:
"""狗累"""
def __init__(self):
print('init方法')
dog1 = Dog()
4、带其他参数的init方法
语法:def __init__(self, 参数1,参数2,....):
函数体
__init__方法的参数需要通过构造方法来传。(构造方法的实参,会传递给init方法的形参)
class Dogs:
def __init__(self, name, age):
print(name, age)
dog2 = Dogs('小明', 12)
属性:用的来在类中保存数据的变量。
属性分为:对象属性和类的字段
五、对象的属性
对象属性:如果属性的值会因为对象不同而同,这种属性就需要声明成对象属性
例如:人名、年龄等
注意:对象的属性需要通过对象来使用,属性都可以修改
1、对象属性的声明(重点)
- a.必须声明在init方法中
- b.声明格式:self.属性名 = 初值
2、对象属性的使用
语法:对象.属性
class Person:
"""人"""
def __init__(self):
self.name = '小明'
self.age = 18
self.sex = '男'
per1 = Person()
- 声明一个类,每次创建对象时就能直接确定不同的属性值
class Person1:
"""人"""
def __init__(self, name, age=0, sex='girl'):
self.name = name
self.age = age
self.sex = sex
per1 = Person1('张三', 16, '女')
print(per1.name, per1.age, per1.sex)
# ```
per3 = Person1('huahua')
print(per3.name)
六、对象属性的增删改查
1、查(获取属性值)
-
a.方式一
语法:对象.属性
注意:通过这种方式获取属性值,当属性不存在时,会报错 -
b.方法二
语法:getattr(对象,属性名,默认值)
语法:getattr(对象,属性名)
注意:以上两个getattr的两个用法中,没有默认值时,当属性值不存在时还是会报错,
反之设置默认值,属性不存在时会返回默认值(不会报错) -
c.方法三
语法:对象.getattribute(属性名) 获取指定属性的值
2、增改(给对象添加属性)
注意:只能给某个特定的对象添加属性,不会影响当前类的其他属性
-
a.方法一
语法:对象.属性 = 值(属性不存就是添加,存在时就是修改) -
b.方法二
语法:setattr(对象,属性名,属性值) -
c.方法三
语法:对象.setattr(属性名,属性值)
3、删除对象属性
注意:删除只是删除当前对象的属性,当前类的其他对象没有影响
-
a.方法一
语法:del 对象.属性 -
b.方法二
语法:delattr(对象,属性名)
注意:如果属性不存在也会报错 -
c.方法三
语法:对象.delattr(属性名)
class Student:
def __init__(self, name , age = 0, studey_id = '001'):
self.name = name
self.age = age
self.study_id = studey_id
stu = Student('小明')
# print(stu.name1) #AttributeError: 'Student' object has no attribute 'name1'
print(getattr(stu, 'name1', 'None'))
# 添加属性
stu.sex = '男'
print(stu.sex)
# 属性存在时修改
setattr(stu, 'name', '娜美')
print(stu.name)
# 属性不存在就是添加
setattr(stu, 'name2', 'zhangsan')
print(stu.name2)
# 删除属性
# 删除后就不能再使用
del stu.age
print(stu.age)
七、对象的使用
1、Python中所有数据都是对象,所有的变量存储的都是对象的地址
- 注意:对象赋值都是赋地址,拷贝就会产生新的对象
2、对象做为列表的元素
class Student:
def __init__(self, name, age = 0, score = 0):
self.name = name
self.age = age
self.score = score
# 定制当前类的对象的打印格式,函数返回值必须是字符串
def __str__(self):
return str(self.__dict__)
students = [Student('zhangsan', 13, 67), Student('xiaoxue', 14, 78), Student('xiaohong', 17, 90)]
max1 = students[0].score
name1 = students[0].name
for stu in students:
if stu.score > max1:
max1 = stu.score
name1 = stu.name
print(name1, max1)
stu1 = Student('李四', 16, 78)
# 列表排序
students.sort(key = lambda item: item.score, reverse=False)
for stu in students:
print(stu)
max2 = max(students, key = lambda item: item.score)
print(max2)
# 根据姓名查找指定学生的信息
name = input('输入姓名:')
for stu in students:
if stu.name == name:
age = input('输入年龄:')
stu.age = str(age)
八、魔法__slots__
- 属性:对象属性,类的字段
- 类的字段:声明在类里面函数外面的变量就是类的字段。
- 使用的时候要通过类来使用:类.字段
- __slots__魔法:用来约束当前类的对象的属性有哪些
class Dog:
num = 10 # 这就是类的字段
__slots__ = ('name', 'color', 'type', 'price', 'age')
def __init__(self, name, color):
self.name = name
self.color = color
dog1 = Dog('大黄', 'red')
dog1.type = '本地用户'
print(dog1.type)
九、内置类属性
class Person:
"""人类"""
# 类的字段
num = 10
def __init__(self, name, age, sex):
self.name = name
self.age = age
self.sex = sex
# 对象方法
def run(self):
print('%s 在跑' % self.name)
p1 = Person('小明', 18, '男')
# 1、__name__属性
# 语法:类.__name__获取当前类的名字
print(Person.__name__, type(Person.__name__))
# 2、__doc__
# 语法:类.__doc__:获取类的说明文档
print(Person.__doc__)
# 3、__dict__
# 类.__dict__获取当前类的所有字段和其对应的值,以字典的形式返回(了解)
print(Person.__dict__) # 获取类的所有字段
# 对象.__dict__获取当前的对象的所有的属性和其对应的值,以字典的形式放回
print(p1.__dict__)
# 4、__module__
# 类.__module__获取当前类所在的模块
print(Person.__module__)
# 5、__bases__
# 类.__bases__获取当前类的父类,返回的是一个元祖,元祖的元素就是一个类
print(Person.__bases__)
补充:对象.class:获取对象属于哪个类
my_class = p1.__class__ # my_class获取到的类与p1的类相同,并且拥有类的相关操作
p2 = my_class('xiaohua', 15, '女') # 通过__class__创建对象
print(p2)