python面向对象基础(一)

系统 1448 0

一. 面向对象编程 Object-Oriented Programing

  • 什么是对象:对象是指现实中的物体或实物;
  • 什么是面向对象:把一切看成对象(实例),用各种对象之间的关系来描述实物
  • 对象都有什么特征:
  1. 对象有很多属性(名词):可以通过实例访问的变量称为属性,如:姓名,性别,年龄,...
  2. 对象有很多行为(动作):学习,吃饭,睡觉...
  • 面向对象的最大优势:每个对象可以管理自己的资源

二. 什么是类

       拥有相同属性,行为的对象分为一组,即为一个类。类是用来描述对象的工具,用类可以创建此类的对象(实例)。int float complex dict bytes set str tuple list ValueError ... python中已经为我们写好了很多类,但并不能满足所有需求,有时需要我们自己创建类,类的创建使用class语句,如下:

  • 语法:
            class 类名(继承列表):
                '''类文档字符串'''
                实例方法定义
                类变量定义
                类方法定义(@classmethod)
                静态方法定义(@staticmethod)
  • 作用:
  1. 创建一个类;
  2. 用于描述对象的行为和属性;
  3. 用于创建此类的一个或多个同类对象(实例)
  • 说明:
  1. 继承列表可以省略,省略继承列表表示此类继承自object;
  2. 类名必须为标识符;
  3. 类名实质是个变量,绑定一个类

三. 实例方法和实例属性

  • 语法:

        class 类名(继承列表):
            def 实例方法(self, 形参1, 形参2, ...):
                '''方法的文档字符串'''
                    语句块

  • 作用:用于描述一个对象的行为,让此类型的全部对象都拥有相同的行为;
  • 说明:
  1. 实例方法的实质是函数,是定义在类内的函数;
  2. 实例方法至少有一个形参,第一个形参代表调用这个方法的实例,一般命名为'self';
  • 实例方法的调用语法:
  1. 实例.实例方法名(调用传参)
  2. 类名.实例方法名(实例,调用传参)
  • 实例属性也叫实例变量:每个实例可以使用自己的变量,称为实例变量(也叫属性)
  1. 使用语法:实例.属性名;
  2. 属性的赋值规则:首次为属性赋值则创建属性,再次为属性赋值则改变属性的绑定关系;
  3. 作用:记录每个对象自身的数据;
  4. 删除属性:del 对象.属性名
  • del 语句总结:
  1. 删除变量 del a;
  2. 删除列表中的元素 del L[0];
  3. 删除字典中的键 del d['name'];
  4. 删除对象的属性 del dog1.color

四. 构造函数

  • 构造函数调用表达式:(函数名是个类名)

        类名([创建传参列表])

  • 作用:创建这个类的实例对象,并返回此实例对象的引用关系;
  • 说明:
  1. 实例有自己的作用域和名字空间,可以为该实例添加实例变量(也叫属性);
  2. 实例可以调用类方法和实例方法;
  3. 实例可以访问类变量和实例变量

五. 初始化方法

  • 作用:对新创建的对象添加属性等初始化操作;
  • 语法格式:

        class 类名(继承列表)
            def __init__(self[,形参列表])
                语句块
        注:[]里的内容代表可省略

  • 说明:
  1. 初始化方法名必须为__init__不可改变;
  2. 初始化方法会在构造函数创建实例后自动调用;
  3. 构造函数的实例将通过__init__方法的参数列表传入到__init__方法中;
  4. 初始化方法内如果需要return语句返回,则只能返回None。

六. 析构方法

  • 语法:

        class 类名(继承列表):
            def __del__(self):
                语句块

  • 作用:通常用来释放此对象占用的资源;
  • 说明:析构方法会在对象被销毁时自动调用;python语句建议不要在对象销毁时做任何事情,因为对象销毁的时间难以确定。
  • code
            
              """析构方法的用法"""


class Car:
    """docstring for Car"""
    def __init__(self, name):
        self.name = name
        print('汽车', name, '对象被创建')

    def __del__(self):
        print('汽车', self.name, '对象被销毁')


c1 = Car('BYD E6')
l1 = list()
l1.append(c1)
# 引用计数法:虽然c1变量绑定了None对象,但列表中仍有变量绑定Car('BYD E6')对象,故Car('BYD E6')不被销毁
c1 = None

# 阻止程序退出,因为在程序退出时,对象将被自动销毁
while True:
    pass
            
          

七. 预置的实例属性

  • __dict__属性:绑定一个存储此实例自身变量的字典
  • __class__属性:绑定创建此实例的类(类实例),可以借助此属性来访问创建此实例的类

八. 用于类的函数

  • isinstance(obj, class_or_tuple)    返回这个对象obj是否是某个类的对象,或者某些类中的一个类的对象,如果是则返回True,否则返回False;
  • type(obj)    返回对象的类
  • 示例:

         python面向对象基础(一)_第1张图片

利用Python实现的学生类:

            
              """此类用来描述学生信息.要求如下:
1.为该类添加初始化方法,实现在创建对象时自动设置'姓名' '年龄' '成绩'属性;
2.添加set_score方法,能为对象修改成绩信息,并限制成绩在0-100之间;
3.添加show_info方法打印学生对象的信息
"""


class Student:
    def __init__(self, name, age, score):
        """每当根据student类创建实例时,都将自动运行此方法"""
        self.name = name
        self.age = age
        self.score = score

    def set_score(self, score):
        """self实参将自动被传递,它是一个指向实例本身的引用,让实例能够访问类中的属性和方法"""
        try:
            assert 0 <= score <= 100, '成绩有误,无法修改!'
            self.score = score
        except AssertionError as err:
            print(score, err)

    def show_info(self):
        print('%s今年%d岁,成绩是:%d' % (self.name, self.age, self.score))

    def get_score(self):
        return self.score


if __name__ == "__main__":
    # 传递的参数由__init__方法的形参决定
    s1 = Student('Limuxia', 22, 99)
    s1.show_info()

    s1.set_score(100)
    s1.show_info()

    s1.set_score(200)
    s1.show_info()

    # 面向对象变成中不建议在调用程序中直接修改和获取实例的属性,而是通过方法来返回对象的属性
print('s1绑定的对象成绩是:', s1.get_score())
            
          

 


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论