Python面向对象(三)

本文介绍了Python面向对象编程中的私有属性和方法,包括它们的定义和限制,并通过示例展示了如何使用双下划线进行私有化。接着讨论了继承的概念,解释了如何通过继承实现代码重用,并通过实例演示了子类继承父类的特性。同时,文章还探讨了多态的概念,展示了不同子类如何重写父类方法以实现不同行为。最后,讲解了类变量、静态方法和类方法的使用,强调了它们在类结构中的作用和区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


活动地址:优快云21天学习挑战赛

十三、私有属性

在实际工作中,我们有时候需要限制实例随意修改属性,这时候就要用到私有属性。定义私有属性很简单,只要在定义属性名字的前面使用两条下划线作为开头。

class Factory:
    '''这是一个工厂类'''
    def __init__(self,name,money):
        self.name=name
        self.__money=money
        print('公司名字叫:{}'.format(self.name))
        print('公司有{} 资产。'.format(__money))
 
    def jianyan(self):
        print('这是工厂里面负责检验的。')
 
 
factory1=Factory('X超级工厂',99999999)
factory1.jianyan()
 
#输出:
'''
公司名字叫:X超级工厂
Traceback (most recent call last):
  File "G:\Python Project Center\面向对象学习.py", line 15, in <module>
    factory1=Factory('X超级工厂',99999999)
  File "G:\Python Project Center\面向对象学习.py", line 7, in __init__
    print('公司有{} 资产。'.format(__money))
NameError: name '_Factory__money' is not defined
'''

十四、私有方法

私有方法和私有属性一样,私有方法只能在类内部被调用,实例不能直接调用。

class Factory:
 
    def __inf(self):
        print('超级工厂')
    def zuzhuang(self):
        print('这里负责组装')
 
factory1=Factory()
factory1.zuzhuang()
factory1.__inf()
#输出
'''
Traceback (most recent call last):
  File "G:\Python Project Center\面向对象学习.py", line 10, in <module>
    factory1.__inf()
AttributeError: 'Factory' object has no attribute '__inf'
这里负责组装
'''

十五、继承

继承,是一种对类进行分层划分的概念,继承的基本思想是在一个类的基础上制定出一个新的类,这个新的类不仅可以继承原来类的属性和方法,还可以增加新的属性和方法。原来的类被称为父类,新的类被称为子类。

继承:实现代码的重用 相同的代码不需要重复的编写。
在这里插入图片描述
继承的语法:

class 类名(父类名):
    pass

子类继承父类,可以直接享受父类封装好的方法,不需要再次开发

class Factory:
    def jianyan(self):
        print('这是工厂里面负责检验的。')
 
    def zuzhuang(self):
        print('这是工厂里面负责组装的。')
 
    def baozhuang(self):
        print('这是工厂里面负责包装的。')
 
    def chuhuo(self):
        print('这是工厂里面负责出货的。')
 
 
class QiCheFactory(Factory):
    def jinrong(self):
        print('这里提供金融服务!')
 
x_car=QiCheFactory()
x_car.chuhuo()
x_car.jinrong()
 
#输出:
'''
这是工厂里面负责出货的。
这里提供金融服务!
'''

继承的时候需要注意:

1、在继承中,如果子类定义了__init__方法,则父类的__init__方法不会被自动调用,需要在子类的__init__方法中专门调用。

class Factory:
    def __init__(self,name):
        self.name=name
 
    def jianyan(self):
        print('这是{},里面负责检验的。'.format(self.name))
 
class QiCheFactory(Factory):
    def __init__(self):
        print('超级工厂!')
 
    def jinrong(self):
        print('这里提供金融服务!')
 
x_car=QiCheFactory()
x_car.jianyan()
#输出:
'''
Traceback (most recent call last):
  File "G:\Python Project Center\面向对象学习.py", line 16, in <module>
    x_car.jianyan()
  File "G:\Python Project Center\面向对象学习.py", line 6, in jianyan
    print('这是{},里面负责检验的。'.format(self.name))
AttributeError: 'QiCheFactory' object has no attribute 'name'
超级工厂!
'''

我们可以使用super函数调用__init__方法。

class Factory:
    def __init__(self,name):
        self.name=name
 
    def jianyan(self):
        print('这是{},里面负责检验的。'.format(self.name))
 
class QiCheFactory(Factory):
    def __init__(self):
        super(QiCheFactory,self).__init__('超级工厂')
 
 
    def jinrong(self):
        print('这里提供金融服务!')
 
x_car=QiCheFactory()
x_car.jianyan()
#输出:
'''
这是超级工厂,里面负责检验的。
'''

2、子类不能继承父类中的私有方法,也不能调用父类的私有方法。

class Factory:
    def __init__(self,name):
        self.name=name
 
    def jianyan(self):
        print('这是{},里面负责检验的。'.format(self.name))
 
    def __jianyan(self):
        print('这是{},里面负责检验重要物料。'.format('特殊车间'))
 
class QiCheFactory(Factory):
    def __init__(self):
        pass
 
    def jinrong(self):
        print('这里提供金融服务!')
 
x_car=QiCheFactory()
x_car.jianyan()
x_car.__jianyan()
#输出:
'''
Traceback (most recent call last):
  File "G:\Python Project Center\面向对象学习.py", line 21, in <module>
    x_car.__jianyan()
AttributeError: 'QiCheFactory' object has no attribute '__jianyan'. Did you mean: 'jianyan'?
这是超级工厂,里面负责检验的。
'''

十六、多态

不同的子类对象调用相同的父类方法,产生不同的执行结果:

  • 多态可以增加代码的灵活度
  • 以继承和重写父类方法为前提
  • 是调用方法的技巧,不会影响到类的内部设计
class Factory:
    def shengchan(self):
        print('我们负责生产高铁。')
 
class QiCheFactory(Factory):
    def shengchan(self):
        print('我们负责生产汽车。')
 
class LunTaiFactory(Factory):
    def shengchan(self):
        print('我们负责生产轮胎。')
 
qiche=QiCheFactory()
qiche.shengchan()
 
luntai=LunTaiFactory()
luntai.shengchan()
 
#输出:
'''
我们负责生产汽车。
我们负责生产轮胎。
'''

分析:

    当子类和父类存在相同的方法时,子类的方法会覆盖父类的方法,这样代码在运行时总是会调用子类的方法,这就是多态。

    多态的意思就是多种形态。多态意味着即使不知道变量所引用的对象时什么类型,也能对对象进行操作。多态会根据类的不同而表现出不同的行为。

判断一个实例是不是某个对象,可以使用isinstance函数。举例如下:

class Factory:
    def shengchan(self):
        print('我们负责生产高铁。')
 
class QiCheFactory(Factory):
    def shengchan(self):
        print('我们负责生产汽车。')
 
class LunTaiFactory(Factory):
    def shengchan(self):
        print('我们负责生产轮胎。')
 
qiche=QiCheFactory()
luntai=LunTaiFactory()
 
print(isinstance(qiche,QiCheFactory))
print(isinstance(qiche,Factory))
print(isinstance(luntai,LunTaiFactory))
print(isinstance(luntai,Factory))
#输出:
'''
True
True
True
True
'''

十七、类变量

类变量不需要实例化就能直接使用,相当于绑定在类上,而不是绑定在实例上。

class Factory:
    name='X工厂'
 
print(Factory.name)
 
#输出
'''
X工厂
'''

但是类变量在实例中也是可以被调用的。值得注意的是,实例不能修改类变量。

class Factory:
    name='X工厂'
 
print(Factory.name)
 
qiche=Factory()
luntai=Factory()
 
print(qiche.name)
print(luntai.name)
 
Factory.name='超级工厂'
 
print(qiche.name)
print(luntai.name)
 
#输出
'''
X工厂
X工厂
X工厂
超级工厂
超级工厂
'''

十八、静态方法

静态方法和类变量有点类似,静态方法在定义类时就已经被分配定义好了。静态方法并不绑定类也不绑定实例,想当于给方法添加了一个前缀。定义静态方法将引入一个新的概念——装饰器。

定义静态方法的语法就是在定义函数的上面一行(不能有空行)添加一句"@staticmethod"。静态方法不再有第一个默认参数 self。所以静态方法本身也不能调用成员变量和成员方法。静态方法不需要实例化之后使用,和类变量一样直接使用即可,其他的和一般函数没有任何区别。

class Factory:
    name='X工厂'
 
    @staticmethod
    def inf():
        print('本公司是世界五百强!')
 
Factory.inf()
#输出
'''
本公司是世界五百强!
'''

十九、类方法

类方法,顾名思义就是该方法绑定在定义的类上面,而不是绑定在实例上。

定义类方法和静态方法有点类似,是在定义类方法的前一行(不能有空行)添加一句装饰器"@classmethod"。和静态方法不同的是,类方法和成员方法一样都有一个初始的参数,但是这个参数不同于成员方法。成员方法的第一个参数指向的是实例,而类方法指向的则是定义的类本身,所以类方法可以读取和修改类变量。

class Factory:
    name='X工厂'
 
    @classmethod
    def inf(cls):
        print(cls.name,'世界五百强。')
 
Factory.inf()
#输出
'''
X工厂 世界五百强。
'''
Vivado2023是一款集成开发环境软件,用于设计和验证FPGA(现场可编程门阵列)和可编程逻辑器件。对于使用Vivado2023的用户来说,license是必不可少的。 Vivado2023的license是一种许可证,用于授权用户合法使用该软件。许可证分为多种类型,包括评估许可证、开发许可证和节点许可证等。每种许可证都有不同的使用条件和功能。 评估许可证是免费提供的,让用户可以在一段时间内试用Vivado2023的全部功能。用户可以使用这个许可证来了解软件的性能和特点,对于初学者和小规模项目来说是一个很好的选择。但是,使用评估许可证的用户在使用期限过后需要购买正式的许可证才能继续使用软件。 开发许可证是付费的,可以永久使用Vivado2023的全部功能。这种许可证适用于需要长期使用Vivado2023进行开发的用户,通常是专业的FPGA设计师或工程师。购买开发许可证可以享受Vivado2023的技术支持和更新服务,确保软件始终保持最新的版本和功能。 节点许可证是用于多设备或分布式设计的许可证,可以在多个计算机上安装Vivado2023,并共享使用。节点许可证适用于大规模项目或需要多个处理节点进行设计的用户,可以提高工作效率和资源利用率。 总之,Vivado2023 license是用户在使用Vivado2023时必须考虑的问题。用户可以根据自己的需求选择合适的许可证类型,以便获取最佳的软件使用体验。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值