美文网首页
2018-10-17day14对象介绍和相关操作

2018-10-17day14对象介绍和相关操作

作者: MW演员 | 来源:发表于2018-10-17 17:35 被阅读0次

    一、编程类型

    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对象介绍和相关操作

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