美文网首页
Python学习总结【连载】(十二)

Python学习总结【连载】(十二)

作者: Juttachen_8e9d | 来源:发表于2018-06-27 17:54 被阅读32次

    Python学习总结【连载】(十一,十二)

    2018.06.27 Juttachen


    概述

    + 37 类的定义

    + 38 对象属性和init方法

    + 39 self

    + 40 属性的增删改查

    + 41 内置类属性


    三十七、类的定义

    复习
    类:具有形同属性和功能的对象的集合;是抽象的
    对象:类的实例;具体的

    1.类的声明

    格式:

    class 类名(父类):
    属性
    方法

    class 类名:
    属性
    方法

    a.class:python中声明类的关键字
    b.类名:标识符。特殊规范:首字母大写,见名知意。
    c.属性:分类的字段和对象的字段 ----------->属性
    d.方法:分对象方法(构造方法),类方法,静态函数 ---------->功能

    1)方法:就是声明在类中的函数(都有一个默认参数,不需要调用的时候给他传值)
    2)对象方法:在类中直接声明的函数,带一个参数self,要使用对象来调用

        # 声明类
        class Person:
            """人类""" # 类的说明文档
    
            # 在类中声明了eat方法,默认有一个参数self,调用eat防范的时候,不需要给delf传参
            # 在类中直接声明的函数都是对象方法,对象方法必须使用对象来调用
    
            def eat(self):
                print('吃饭')
    
            # 直接写在类中的函数,必须带参数self
            # def run()
            #   print('aaa')
    
        # 注意:如果要在类中声明带参才能的对象方法,那么其他的参数必须写在self的后面
            def run(self,num):
                print('跑了%s米'%(num))
    

    2. 创建对象

    通过类名就可以创建对象,然后可以用变量存起来
    可以通过对象去调用类中的对象方法,和使用类中声明的对象属性(字段)

        p1 = Person()
        # p1就是Person类的一个实例(对象)
    

    调用对象方法,对象.方法()
    写在类里面的函数也可以传参

        p1.eat()
        p1.run(100)
    

    一个类可以创建多个对象

        p2 = Person()
        p2.eat(80)
    

    三十八、对象属性和init方法

    实例一:init方法会自动被调用。
    _ init _方法又叫构造方法。是在通过类创建对象的时候,自动调用的方法。
    _ init _方法的作用就是在创建对象的时候初始化对象的属性。
    _ init _:对象的属相就是声明在整个方法中

        class Person:
            def __init__(self):
                # 在这个地方声明对象的属性。。。
                print('这个是init')
    

    在声明对象的时候会自动调用init方法

        p1 = Person()
        p2 = Person()
    

    实例二:带参的init方法
    init的方法的方法名固定:init。但是参数是可以随意改变的(但是self参数不变)

        class Dog:
            def __init__(self,name):
                print('名字是:%s'%(name))
    

    通过类创建对象的时候,要保证init方法里面的每一个参数都有值。通过类后面的括号里传参来保证每个参数都有值。

        dog1 = Dog('蔡蔡')
    

    实例三:对象属性
    属性:声明在类中的变量
    对象属性:要通过对象去使用;不同的对象可能会有不同的值:

        class Person2:
            """人类"""
            # 在init方法中声明对象的属性:self.属性名 = 初值
            def __init__(self):
                # 声明一个对象属性name:初始值为空串
                self.name = ''
                # 声明一个对象属性age:初始值为10
    
        # 通过Person2类创建对象1
        p1 = Person2
        # 通过对象去修改P1的name属性
        p2 = Person2
        # p1.name = 'print(p2.name)
    

    练习:声明一个学生类,拥有属性:名字,年龄,电话。拥有方法:学习

        class Student:
            def __init__(self):
                self.name = ''
                self.age = 18
                self.tel = 12345678910
    
            def study(self):
                print('学习')
    
        stu = Student()
        stu.name = '韩梅梅'
        print(stu.name,stu.age,stu.tel)
        # 调用对象方法(给对象发送消息)
        stu.study()
    

    实例四:创建对象的时候赋初值

        class Student2:
            def __init__(self,name1='',age1=1,tel1=''):
                self.name = name1
                self.age = age1
                self.tel = tel1
    
        # 在创建对象的时候给对象属性赋初值
        stu2 = Student2('小明', 18,'112')
        print(stu2.name)
        stu3 = Student2(name1="小王")
    

    三十九、self

    类中的对象方法都有一个默认参数self:
    1.调用带有默认参数self的方法,不需要给self传参。系统会自动将调用当前方法的对象传给self
    2.在方法中使用self就相当于使用调用方法的对象(只能使用self,不能重新给self赋值)

        class Person:
            """人"""
    
            def __init__(self, name='', age=''):
                """声明对象的属性"""
                self.name = name
                self.age = age
    
            def eat(self):
                print('%s eat breakfirst.' % (self.name))
    
            # 声明一个对象的方法run
            def run(self):
                print('self', self)
                print('run now!!')
    
                # 在对象方法中使用对象的属性,直接用self去获取属性
                print('%s run now' % (self.name))
                self.eat()
    
    
        # 创建一个Person对象
        p1 = Person('小明', 10)
    
        # 通过对象p1去调用run方法,系统会将self = p1
        # 这个时候在run方法中,p1和self是同一个东西
        p1.run()
        print('p1', p1)
        # eat中的self = p1
        p1.eat()
    
        p2 = Person('小红', 20)
        p2.run()
        p2.eat()
    

    练习:声明一个圆类,拥有属性:半径 拥有方法:计算圆的面积,计算圆的周长

        import math
        # 或者 from math import pi(之后就不需要写math.pi,而是直接写pi)
    
        class Circle:
            def __init__(self, radius=10):
                self.r = radius
    
            # 在对象方法中可以通过self去使用对象
            def area(self):
                C = math.pi * self.r ** 2
    
            # 注意要 return C 或者直接 return math.pi * self.r ** 2
    
            def perimeter(self):
                l = 2 * math.pi * self.r
                return l
            # 同上道理
        c1 = Circle()
        print('%.2f' % c1.area())
        print('%.2' % c1.perimeter())
    
        c2 = Circle(3)
        print(c2.area())
    

    四十、属性的增删改查

        class Dog:
            """狗狗"""
          def __init__(self,name = '',age = 0):
        self.name = name
        self.age = age
        dog1 = Dog('才才')
    

    1.查

    方法一:对象.属性
    特点:如果属性村子就获取属性的值。如果属性不存在就会报错。

        print(dog1.name)
        # print(dog1.score) # AttributeError: 'Dog' object has no attribute 'score'
    

    方法二:getattr(对象,属性名,默认值) --> 获取指定对象的指定属性
    如果不设置默认值:属性如果存在就获取属性的值,不存在就会报错
    如果设置默认值:属性如果存在就获取属性的值,不存在不仅不报错,而且将默认值作为结果(但是不创建属性)

      """
            getattr(object, name[, default]) -> value
    
            Get a named attribute from an object; getattr(x, 'y') is equivalent to x.y.
            When a default argument is given, it is returned when the attribute doesn't
            exist; without it, an exception is raised in that case.
      """
    

        print(getattr(dog1,'name'))
        print(getattr(dog1,'score',100))
        # print(getattr(dog1,'color')) # AttributeError: 'Dog' object has no attribute 'color'
        # print(getattr(dog1,'score')) # AttributeError: 'Dog' object has no attribute 'score'
    

    方法三:对象.getattribute(属性名)
    获取指定对象的指定属性。如果属性不存在就会报错。

        print(dog1.__getattribute__("name"))
        # print(dog1.__getattribute__("sex")) # 和方法一一样报错
    

    2.改(修改)

    方法一:对象.属性 = 新值

        dog1.name = '大黄'
        print(dog1.name)
    

    方式二:setattr(对象,属性名,新值)

        setattr(dog1,'name','小黄')
        print(dog1.name)
    

    方式三:对象.setattr()

        dog1.__setattr__('name','小黑')
    

    3.增(添加属性)

    python中可以动态的给对象添加属性
    方法一:
    用对象.属性 = 新值就可以增加(只要对象不存在)

        dog1.sex = '男'
        print(dog1.sex)
    

    方式二:setattr(对象,不存在的属性名,新值)

        setattr(dog1,'color','brown')
        print(dog1.color)
    

    方式三:对象.setattr()

        dog1.__setattr__('score','100')
        print(dog1.score)
    

    4.删除属性

    方法一:del 对象.属性
    将dog1的age属性删除

      del dog1.age
      # print(dog1.age)  # AttributeError: 'Dog' object has no attribute 'age'
    

    方法二:delattr(对象,属性名)

        delattr(dog1,'age')
        # print(dog.age)  # AttributeError: 'Dog' object has no attribute 'age'
    

    方法三:对象.delattr(属性名)

        dog1.__delattr__('age')
        # print(dog1.age) # AttributeError: 'Dog' object has no attribute 'age'
    

    5.判断对象是否拥有某个属性

    方式:hasattr(对象,'属性名') ----> 判断指定的对象是否拥有指定的属性

        result = hasattr(dog1,'name')
        print(result)
    

    补充:
    实例1:对象属性的操作只对当前那一个对象有效

        class Person:
            def __init__(self,name = '',age = 0,id_num = '',sex = ''):
                """人"""
                self.name = name
                self.age = age
                self.id_num = id_num
                self.sex = sex
    
        p1 = Person('小明',10)
    
        # 给不存在的属性赋值,就是添加属性
        p1.score = 100
        print(p1.score+100)
    
        p2 = Person('罗昊',30)
        # print(p2.score) #AttributeError: 'Person' object has no attribute 'score'
    

    注意:1.对对象属性的增,删,改,查是指定那一个对象。不会影响其他的对象。
    2.实际开发的时候,一般只用获取对象属性的值和修改对象属性的值。想添加或删除属性,一般都是在init方法中操作

    实例二:

        class Dog:
            """狗"""
            #  通过给__slots__赋值,可以限制类中对象的属性有哪些,防止一个不必要的属性被添加
            __slots__ = ('name','age','color')
            def __init__(self,name='',age=0,color=''):
                self.name = name
                self.age = age
                self.color = color
                # self.sex = '男' # 在__slots__ 中没有sex的话,不管在哪都不能添加,只能先在__slots__ 中添上才能添加
    
        dog1 = Dog('笑话',3,'Yellow')
        dog1.name1 = '大黄'
    
        del dog1.name
        # 注意__slots__ 中规定的属性只能少不能多。删除属性是不受影响的。
    

    四十一、内置类属性

        class Dog:
            """狗"""
            def __init__(self,name='',age=0,color=''):
                self.name = name
                self.age = age
                self.color = color
    
            def run(self):
                print('%s跑起来'%(self.name))
    
            def shout(self):
                print('%s在叫唤'%(self.name))
        
        dog = Dog()
    

    内置的类属性是属于类的,需要通过类去使用

    1. 类.name :获取类的名字

        class_name = Dog.__name__ # 'Dog'
        print(class_name,type(class_name))
        # 这个属性只有类有
    

    2.类.doc:获取类的说明文档

        print(Dog.__doc__)
    

    3.类.dict(对象.dict):获取类中所有的类属性(类字段)

        print(Dog.__dict__)
        print(dog.__dict__) #获取了所有关于dog的属性和值(以字典键值对的方式)【包括添加的】
    

    4.类.module:获取类所在的模块的名字

        print(Dog.__module__)
    

    5.类.bases :获取指定类的基类

        print(Dog.__bases__)
    

    相关文章

      网友评论

          本文标题:Python学习总结【连载】(十二)

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