Python__面向对象__学习(中)

目录

一、封装

1.隐藏属性

2.私有属性

二、继承

1.继承的方式

2.多继承

3.重写父类和调用父类

面向对象的编程三大特性:封装、继承、多态,python中同样也不例外。

一、封装

Python中,关于属性通常分为三种:公有、保护/隐藏和私有。而封装是将对象的数据(属性)和行为(方法)组合在一起的过程,封装通常通过类来实现。可以使用私有属性(以双下划线__开头)、隐藏属性(以单下划线_开头)来控制属性的访问级别,公有属性则没有任何前缀,默认情况下,所有属性和方法都是公有。此外,还可以使用getter和setter方法来访问或更新属性。

1.隐藏属性

使用单下划线_,这是一个非正式的约定,告诉我们这个属性是内部使用。当然,也可以通过一些方法外部访问。

2.私有属性

私有属性: 使用双下划线__,在Python中通过名称改编提供了真正的封装,使得属性在类的外部不可见。

例:

class Bank:

    def __init__(self, client, asset, sex):
        # 对实例属性进行初始化
        self.client = client  # 公有属性,外部可以访问
        self._number = 12306  # 隐藏属性,按照约定外部不可访问
        self.__asset = 0  # 私有属性,按照约定外部不可见
        self.__sex = sex
        
    def personal(self):  # 自定义一个实例方法
        # 通过personal类的实例(self)访问,而不是Bank类的访问
        print(f"{self.client}的性别为{self.__sex}")

# 创建Bank类的实例,设置形参
person = Bank(client="lin", asset=0, sex='female')

# 输出公有属性client的值
print("姓名:", person.client)

# 输出 隐藏属性 _number的值,虽然按照约定外部不可访问
print("账户:", person._number)

# 输出 私有属性 __asset的值,可通过 _类名__属性名 访问
print("资产:", person._Bank__asset)

# 对私有属性sex 修改的另一种方法,就是在类的内部修改并访问
person.personal()

所谓的约定,可理解为一种特殊的内部名称改换机制:改编(Name Mangling),主要用于保护类中的私有变量不被外部直接访问,也可避免在继承过程中,产生名称冲突。

关于初始化,无论是隐藏属性还是私有属性,都可以在__init__方法中初始化。__init__是类的构造器,是创建新的实例时被调用,对象开始初始化的地方,包括公有属性、隐藏属性和私有属性。

这个例子中,asset 是__init__方法的一个参数,它用于设置私有属性__asset。当创建Bank 类的新的实例时,必须提供 asset 形参的值,但这个值是如何设置到私有属性__asset 中的,对外部代码来说是不知道的。外部代码不能直接访问__asset,否则直接输出则会抛出 AttributeError

私有属性__asset 的名称在类内部是可见的,但一旦代码离开类的作用域,Python会将asset 改编成_Bank__asset(名称改编),这样外部代码就无法直接访问它了。

因此,即使在创建对象时需要提供参数,私有属性的封装性仍然得到了保持。这是Python中实现封装和数据隐藏的一种机制。如果需要在类的外部访问或修改私有属性,可以通过类的getter和setter等方法来进行。

二、继承

在Python中,面向对象编程(OOP)的继承是提供了一种代码复用的方式,允许新创建的类(称为子类或派生类)继承现有类(父类或基类)的属性和方法。

1.继承的方式

语法格式如下:

Class  子类名(父类名):

假设有一个类为A,B类是A类的子类,如下:

 

如果定义的类没有标出父类,那么这个类默认继承自object,即:class A(object)等价于class A

以下介绍“单继承”例子:

class Oven(object):
    # 定义构造函数,它接受一个名为exterior的参数
    def __init__(self, exterior="圆型烤炉"):
        # 初始化self.exterior属性,它是Oven实例的一个属性
        self.exterior = exterior

    # 定义一个名为food的方法,当调用时,它将打印一段文本
    def food(self):
        print("——烤披萨——")


# 定义一个名为Ceramic的类,它继承自Oven类
class Ceramic(Oven):
    # 这个子类目前不添加任何新的属性或方法,但继承了父类的exterior属性和food方法
    pass

# 创建Ceramic类的实例,命名为diy,并将exterior参数赋予一段字符串
diy = Ceramic("陶瓷烤炉")

diy.food()

print(diy.exterior)

 

此外,子类没有继承父类的私有方法,而且不能访问父类的私有方法。因为一般情况下,私有的属性和方法都是不对外显示的。

示例:

class Box(object):
    def __init__(self, weight="1kg" ):  # 构造方法
        self.__weight = weight  # 私有属性 表示重量
    def __init(self):  # 私有方法
        print(self.__weight)
class Strongbox(Box):
    def one_init_(self):
        print(self.__weight)  # 尝试访问父类的私有属性

    def two_init(self):
        self.__init()  # 尝试访问父类的私有方法

box = Strongbox(weight="2kg")
box.one_init_()
box.two_init()

2.多继承

Python支持多继承,所谓多继承是一个子类可以拥有多个父类,并且具有他们共同的特征,即子类会继承父类的方法和属性。

语法格式如下:

class 子类(父类1,父类2)

例子:

 以上代码中定义一个Controller子类,访问Mode和Velocity 两个父类的属性和方法

3.重写父类和调用父类

在继承关系中,子类会自动拥有父类定义的方法,但是有时我们可以让子类拥有自己的方式实现方法,即:对父类中继承来的方法进行重写,使得子类中的方法覆盖掉跟父类同名的方法,或者额外添加新的方法。

例子:

class Vehicle:

    def __init__(self, price, fuel_consumption):
        # 给实例属性的参数初始化赋值
        self.price = price
        self.fuel_consumption = fuel_consumption

    def __str__(self):  # 将对象转换为字符串时能被自动调用
        return f" 售价:{self.price}  油耗:{self.fuel_consumption}"

# 创建一个Vehicle的实例,传递21.59万、0 参数
su7 = Vehicle("21.59万", 0)

print(str("su7"), su7)  # 这里"su7"已经字符串形式,可以不用再调用__str__方法转化

class Car(Vehicle):
    # 重写父类的init方法
    def __init__(self, price):
        # 再重写的构造方法中,添加 endurance属性
        self.endurance = 2000
        # 因为Vehicle类要2个参数,所以下面第2个参数用None作占位符
        super().__init__(price, None)

    def __str__(self):  # 将对象转换为字符串时能被自动调用
        return f" 售价:{self.price}  续航:{self.endurance}"

# 创建一个Vehicle的实例,传递22万、0 参数
su7 = Vehicle("21.59万", 0)
qin_L = Car(" 9.98万")

print('秦L', qin_L)

在Car类(子类)中,继承并修改了Vehicle(父类)的price方法,并添加了新的属性endurance 

 

在Python中,调用父类(即超类或基类)的方法或属性有多种方式,但常用方法用super ()函数来调用父类比较好,因为可以自动处理方法解析顺序(MRO),避免多继承情况时出现混淆......

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值