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)

你可能感兴趣的:(2018-10-17day14对象介绍和相关操作)