Python入门(二十):面向对象(类与对象)

点击跳转
《Python入门系列目录》



1. 面向对象概述

  • 属性:对象的静态特征
  • 方法:对象的动态特征
  • 对象 = 属性 + 方法
  • Python既可以面向过程也可以面向对象
  • 在程序中使用对象来映射现实中的事物,使用对象间的关系来描述事物之间的联系,这种思想就是面向对象
  • 面向过程(procedure-oriented):一种以事件为中心的编程思想
  • 面向对象(object-oriented):一种以事物为中心的编程思想
  • 如果有新功能要添加的时候,面向对象更简便
  • Python中对象的概念很广泛,Python中一切内容都可以称为对象,除了数字、字符串、列表、元组、字典、集合、range对象、zip对象等,函数也是对象,类也是对象
  • 创建类时,用变量形式表示的对象属性称为数据成员,用函数形式表示的对象行为称为成员方法。成员属性和成员方法统称为类的成员

2. 类与对象

2.1 类与对象的关系

  • 面向对象有两个非常重要的概念:类与对象
  • 对象是面向对象编程的核心
  • 具有相似特征和行为的事物的集合统称为类
  • 对象是根据类创建的,一个类可以对应多个对象

2.2 创建类

  • 执行完class类的整段代码以后,这个类才能生效

  • 类的定义

    • class 类名:
          类的属性
          类的方法
      
  • 根据类创建对象的语法格式

    • 对象名 = 类名()
  • 要想给对象添加属性

    • 对象名.新的属性名 = 值
  • # 一次模拟猫咪的尝试
    class Cat:
        name = 'maomi'          # 属性
        age = 3                 # 属性
        # 猫咪睡觉
        def sleep(self):        # 方法
            print('%d岁的%s正在沙发上睡懒觉'%(self.age, self.name))
        # 猫咪吃东西
        def eat(self, food):    # 方法
            self.food = food
            print("%d岁的%s在吃%s" %(self.age, self.name, self.food))
    
  • 类命名惯例

    • 首字母大写
    • 两个单词可以写成HotDog

2.3 绑定self

  • 在方法的列表中,第1个参数永远是self

  • self的字面意思是自己,可以当作C++中的this指针,表示对象自身

  • 在类的实例方法中访问实例属性时需要以self为前缀

  • 当某个对象调用方法的时候,Python解释器会把这个对象作为第1个参数自动传给self,开发者只需要传递后面的参数就可以了

  • 如果在外部通过类名调用对象方法,则需要显式为self参数传值

  • self代表当前对象的地址,能避免非限定调用时找不到访问对象或变量

  • self名称不是必需的,它并不是关键词

    class Test:
        def prt(my_address):                # 第一个参数其实就是self
            print(my_address)               # 打印自己,打印的是地址
            print(my_address.__class__)     # 打印当前实例的类
    
    t = Test()  # self指的是这个t
    t.prt()
    
    class Dog:
        def setOwner(self,name):    # 方法1:设置对象的主人姓名
            self.owner=name
        def getOwner(self):         # 方法2:获取对象的主人姓名
            print('我的主人是:%s'%self.owner)
        def run(self):              # 方法3
            pass                    # 关键字,空语句,保持程序结构完整性
    
    a = Dog()           # 创建了小狗对象a
    a.setOwner("小红")    # 小红认领了小狗a
    b = Dog()           # 创建了小狗对象b
    b.setOwner("兰兰")    # 兰兰认领了小狗b
    a.getOwner()        # 我的主人是:小红
    b.getOwner()        # 我的主人是:兰兰
    

2.4 类的专有方法

  • 用dir()可以查看类的专有方法
  • 通常用双下划线__开头和结尾
  • 访问类或对象的属性和方法,通过点号
    • object.attribute
  • 可以对属性进行修改和增加

tt5qRs.png

2.5 创建对象

  • 类的实例化,创建的对象称为实例对象

  • Python类的构造函数

    • _init_()
    • 一般用来为数据成员设置初值或进行其他必要的初始化工作
    • 在创建对象时被自动调用和执行
    • 如果用户没有设计构造函数,Python将提供一个默认的构造函数用来进行必要的初始化工作
    # 模拟猫咪的尝试
    class Cat:
        # 构造器方法
        def __init__(self, name, age):
            self.name = name
            self.age = age
        # 猫咪睡觉
        def sleep(self):
            print('%d岁的%s正在沙发上睡懒觉'%(self.age, self.name))
        # 猫咪吃东西
        def eat(self, food):
            self.food = food
            print("%d岁的%s在吃%s" % (self.age, self.name, self.food))
    

2.6 删除对象

  • Python中类的析构函数
    • _del_()
    • 一般用来释放对象占用的资源
    • 在Python删除对象和收回对象空间时被自动调用和执行
    • 如果用户没有编写析构函数,Python将提供一个默认的析构函数进行必要的清理工作
class Animal:
    # 构造方法
    def __init__(self):
        print('---构造方法被调用---')
    # 析构方法
    def __del__(self):
        print('---析构方法被调用---')

cat = Animal()
print(cat)
del cat
print(cat)  # 出错
class Cat:
    # 构造器方法
    def __init__(self, name, age):
        self.name = name
        self.age = age
    def sleep(self):
        print('%d岁的%s正在沙发上睡懒觉'%(self.age, self.name))
    def eat(self, food):
        self.food = food
        print("%d岁的%s在吃%s" %(self.age,self.name, self.food))

cat1 = Cat('Tom', 3)
cat2 = Cat('Jack', 4)
print('Cat1的名字为:', cat1.name)
print('Cat2的名字为', cat2.name)
print(cat1.sleep())
print(cat2.eat('fish'))
# print()函数需要有返回值,但是这里两个都没有返回值,所以会多返回两个None

2.7 对象的方法

  • 方法引用
    • 在创建具体实例对象时,程序才会为对象的每个数据属性和方法分配内存
    • 对象名.成员
cat1 = Cat('Tom', 3)
cat2 = Cat('Jack', 4)
print('Cat1的名字为:', cat1.name)
print('Cat2的名字为:', cat2.name)
print(cat1.sleep())
print(cat2.eat('fish'))
cat1 = Cat('Tom', 3)
sleep = cat1.sleep
print(sleep())
cat2 = Cat('Jack', 4)
eat = cat2.eat
print(eat('fish'))

2.8 公有和私有

  • 私有:只公开结果

    • C++用private和public进行区分
  • Python并没有对私有成员提供严格的访问保护机制

    • 定义类成员时,如果成员名以两个或多个下划线开头,但不以两个或多个下划线结束,即前后下划线数量不同,则表示私有成员

    • 私有成员在类的外部不能直接访问,需要通过调用对象的公开成员方法来访问,也可以通过Python支持的特殊方式来访问

  • 公有成员既可以在类的内部进行访问,也可以在外部程序中使用

  • 公有属性

    • 可以通过“对象名.成员”的方法来访问
    class Dog:
        name = '大黄'  # 属性
    
    mydog=Dog()
    print(mydog.name)  # 大黄
    
  • 私有属性

    • Python定义私有类型的方式很简单,只需在变量名前面加上两个下划线
    class Dog:
        __name = '大黄'  # 私有属性
    
  • 访问私有属性

    • 在类的外部不能直接访问,可以利用类内部的方法,通过“self.私有成员”进行访问
    class Dog:
        __name = '大黄'  # 私有属性
        def getName(self):  # 方法:获取私有属性值
            return self.__name
    
    mydog = Dog()
    print(mydog.getName())  # 大黄
    
  • 私有方法

    • 私有方法与私有属性类似,它的名字也是以两个下划线开始,可以在类的内部通过“self.私有成员”来访问
    class Dog:
        __age = 1
        def getAge(self):
            return self.__age
        def __changeAge(self, age):  # 私有方法
            self.__age = age
        def needChange(self, age):
            if type(age) == int:
                self.__changeAge(age)
            else:
                print("年龄更改不合法")
    
    mydog = Dog()
    print(mydog.getAge())  # 小狗的年龄为1
    mydog.needChange("毛毛")  # 年龄更改不合法
    print(mydog.getAge())  # 小狗的年龄为1
    
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值