第六章 面向对象基础

目录

6.1 概述

6.2 两个重要概念:类和对象

6.3 类的构成

6.4 类的定义:以狗为例

6.5 类内外添加属性

6.6 魔法方法

6.7 继承

6.8 私有权限

6.9 多态

6.1 概述

软件的开发思想包括:面向对象和面向过程

面向过程:需要实现一个功能的时候,看重的是开发的步骤和过程,每一个步骤都需要自己亲力亲为,需要自己编写代码。面向对象,当需要实现一个功能的时候,看重的不是过程和步骤,而是谁能帮我完成这件事。

面向对象的三大特征:封装性、继承性和多态性

6.2 两个重要概念:类和对象

(1)将具有共同特征和行为的一组对象抽象定义、提出类

(2)类有属性、行为两个组成部分,对象是类的具体实例

         类:收集设计图

         对象:实体机

(3)对象:客观存在,指代某一个具体实物

类:指代多个实物

例如:类:苹果、红苹果、红富士苹果

对象:手里吃了一半的这个苹果

(4)对象是由类创建的

6.3 类的构成

(1)类(class)由3个部分组成。类的名称(类名),类的属性:一组数据(特征),类的方法:允许进行操作的方法(行为)

例如:狗的设计。类名:狗,属性:品种、毛色、性别,方法(行为):叫、跑、咬人、吃

(2)类的抽象

拥有相同(或相似)属性和行为的对象都可以抽象出一个类

6.4 类的定义:以狗为例

#object表示基类
class Dog(object):#类名每个单词的首字母大写,即大驼峰
    def play(self):#self暂时不管
        print('小狗在玩耍……')
dog = Dog()#创建对象
dog.play()#通过对象调用方法(函数)
>>> 小狗在玩耍……

6.5 类内外添加属性

(1)类外部添加和获取对象属性

类外部添加对象属性:对象.属性名 = 属性值

类外部获取对象属性 对象。属性名

类外部修改属性值,和添加一样

class Dog(object):#创建类
    def play(self):#方法
        print('啦啦啦')
    
dog = Dog()#创建对象
dog.play()
#给对象添加属性 对象.属性 = 属性值
dog.name = '汪汪'#添加属性
dog.age = 2
#获取对象属性值 对象.属性名
dog.age
>>> 啦啦啦
2

(2)类内部通过self添加和获取属性

self 作为类中方法的第一个形参,在通过对象调用方法的时候,不需要手动传递实参值,是python解释器自动将调用该方法的对象传递给self,所以self 代表的是对象

class Dog(object):#创建类
    def play(self):#方法
        print(self.name)
        
dog = Dog()#创建对象
dog.name = '汪汪'#添加属性
dog.age = 2
dog.play()
dog1 = Dog()
dog1.name = '汪呜'
dog1.play()
>>> 汪汪
汪呜

6.6 魔法方法

在python的类中,有一类方法,这类方法以两个下划线开头和两个下划线结尾,并且在满足某个特定条件的情况下回自动调用,这类方法,称为魔法方法。

(1)__init__:在创建对象之后,会立即调用,用来给对象添加属性,给对象属性一个初始值。根据代码的需求,每创建一个对象,都需要执行的代码可以写在__init__里面

#__init__
class Dog(object):
    def __init__(self,name):#可传递参数
        print('啦啦啦')
        self.name = name
 #创建对象时传递实参值       
dog = Dog('呜呜呜')
dog.name
>>> 啦啦啦
'呜呜呜'

(2)__str__方法:print(对象)时会自动调用该方法,返回__str__方法的返回值,或者str(对象)使用类型转换时,将自定义对象转换为字符串时,会自动调用。该方法必须返回(return)一个字符串,只有self一个参数。

class Dog(object):
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def __str__(self):
        return f'小狗的名字是{self.name},年龄是{self.age}'#必须return
dog = Dog('黄',2)#创建对象
print(dog)
>>> 小狗的名字是黄,年龄是2

(3)__del__方法:

①对象在内存中被销毁删除的时候会自动调用__del__方法,如程序代码运行结束,其中创建的所有变量和对象都会被删除;使用del 变量 ,将这个对象的引用计数变为0,会自动调用。

引用计数:是python内存管理的一种机制,是指一块内存,有多少个变量在引用。当一个变量引用一块内存时,引用计数加1,当内存的引用计数变为0的时候,这块内存被删除,内存中的数据被销毁。

② 对象被删除销毁的时候,要书写的代码可以写在__del__中,一般很少使用

class Dog(object):
    def __init__(self,name,age):
        self.name = name
        self.age = age
    def __str__(self):
        return f'小狗的名字是{self.name},年龄是{self.age}'#必须return

    def __del__(self):
        print('lll')
   
    
dog = Dog('d',2)
print(dog)
>>> lll
小狗的名字是d,年龄是2

6.7 继承

(1)①继承描述的是多个类之间的所属关系。如果一个类A里的方法和属性可以复制使用,就能通过继承的方式传递到类B里面。类A就是基类,也叫作父类,类B就是派生类,也叫作子类

②   class 类B(类A):

                pass

③单继承:一个类只有一个父类,把这种继承关系称为单继承。

多继承:一个类有多个父类,为多继承

多层继承:一条继承链上的方法都可以使用

#定义一个动物类
#在动物类书写play方法,输出快乐的玩耍
#创建dog类,继承动物类
#创建Dog类对象,调用animal类方法
class Animal(object):
    def play(self):
        print('快乐玩耍中……')
class Dog(Animal):
    pass
dog = Dog()#创建相应对象
dog.play()#调用父类方法
>>> 快乐玩耍中……

(2)子类重写父类的同名方法

重写:子类定义和父类名字相同的方法。当父类中的方法不能满足子类对象的需求,重写之后,子类调用自己的方法。

class Dog(object):
    def bark(self):
        print('呜呜呜叫')
        
class XTQ(Dog):
    def bark(self):
        print('嗷嗷嗷叫')
        
dog = Dog()
dog.bark()

xtq = XTQ()
xtq.bark()
>>> 呜呜呜叫
嗷嗷嗷叫

(3)子类调用父类的同名方法

① 父类名.方法名(self,其他参数),通过对象调用实参值不需要传递实参值

② super(类A,self).方法名(参数),会调用类A父类的方法

③ super().bark()  方法2的简写

class Dog(object):
    def bark(self):
        print('呜呜呜叫')
        
class XTQ(Dog):
    def bark(self):
        print('嗷嗷嗷叫')
    def see_host(self):
        Dog.bark(self)#调用父类方法
        
xtq = XTQ()
xtq.bark()
xtq.see_host()
>>> 嗷嗷嗷叫
呜呜呜叫

(4)继承中的init

如果子类重写了父类的init方法,在子类中需要调用父类的init方法,给对象添加从父类继承的属性。

class Dog(object):
    def __init__(self,name):
        self.age = 0
        self.name = name
    def __str__(object):
        return f'名字为{self.name}年龄为{self.age}'
        
class XTQ(Dog):
    pass
xtq = XTQ('小黑')
print(xtq)

(5)多继承

一个类有多个父类,这种继承关系称为多继承。

class Dog(object):
    def bark(self):
        print('呜呜呜叫')
    def eat(self):
        print('啃骨头')

class God(object):
    def play(self):
        print('云中君……')
        
    def eat(self):
        print('吃仙丹')
        
class XTQ(Dog,God):#多继承
    pass
xtq = XTQ()
xtq.bark()
xtq.play()

xtq.eat()#父类中两个相同方法,默认定义XTQ时第一个父类中的方法
>>> 呜呜呜叫
云中君……
啃骨头

6.8 私有权限

(1)① 类的私有属性和私有方法,都不能通过对象直接访问,但可以在本类内部访问

②类的私有属性和私有方法,都不会被子类继承,子类也无法访问

③ 私有属性和私有方法往往用来处理类的内部事情,不通过对象处理,起到安全作用

(2)访问权限控制。在方法和属性前面加上两个下划线,就变为私有。①不能在类外部通过对象直接访问和使用,只能在类内部访问和使用;②不能被子类继承。

(3)对象.__dict__  可以查看对象具有的属性信息,类型是字典,字典的属性是属性名,字典的Value 是属性值。python的私有本质是 修改属性的名字

#私有属性,只需要在原属性前加上两个下划线
#定义一个公有的方法,通过这个方法使用
class People(object):
    def __init__(self):
        self.__ICBC = 0#定义私有属性
    def save_money(self):
        return self.__ICBC
    def set_money(self,money):
        self.__ICBC = self.__ICBC + money
        
xz = People()
xz.set_money(1000)
xz.save_money()
>>>1000

(4)私有方法。在方法前加两个下划线,成为私有方法,不能在类外访问

class Dog(object):
    def born(self):
        print('生了一只小狗')
        self.__sleep()
    
    def __sleep(self):
        print('休息30天')
        
dog = Dog()
dog.born()
>>> 生了一只小狗
休息30天

6.9 类属性和类方法和静态方法

类对象:通过class定义的,又称为类对象,是python在创建类的时候自动创建的。通过类对象可以定义实例对象,并且可以保存属性信息,即类属性。

(1)类属性

class Dog(object):
    def __init__(self,name,age):
        self.name = name
        self.age = age
        
    class_name = '狗类'
    
dog = Dog('得到',2)
Dog.__dict__#查看类属性
Dog.class_name#访问类属性
>>> '狗类'

(2)类方法

class Dog(object):
    class_name = '狗类'
    def __init__(self,name,age):
        self.name = name
        self.age = age
        
    def play(self):
        print(f'{self.name}在玩耍')
        
    @classmethod
    def get_class_name(cls):
        return cls.class_name
    
dog = Dog('大黄',2)
dog.play()
dog.get_class_name()
>>> 大黄在玩耍
'狗类'

(3)静态方法

使用@staticmethod装饰的方法成为静态方法,对参数无要求。

class Dog(object):
    class_name = '狗类'
    def __init__(self,name,age):
        self.name = name
        self.age = age
        
    def play(self):
        print(f'{self.name}在玩耍')
        
    @staticmethod#创建静态方法
    def show_info():
        print('这是一个Dog类')
    
dog = Dog('大黄',2)
dog.play()
dog.show_info()#调用静态方法
>>> 大黄在玩耍
这是一个Dog类

6.9 多态

在需要使用父类对象的地方,也可以使用子类对象,这种情况就叫多态

class Dog(object):
    def __init__(self,name):
        self.name = name
    def play(self):
        print(f'{self.name}在玩耍')
        
class XTQ(Dog):
    def play(self):
        print(f'{self.name}在啦啦啦')
    
def play_with_dog(obj_dog):
    obj_dog.play()
    
dog = Dog('大黄')
play_with_dog(dog)
xtq = XTQ('小黑')
play_with_dog(xtq)
>>> 大黄在玩耍
小黑在啦啦啦

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值