我与Python的偶遇(第七篇)


活动地址:CSDN21天学习挑战赛

对象相关特性


1,私有属性和私有方法

在项目开发的过程中,我们写的一些变量或者方法仅仅在类的内部使用,不希望实例直接访问,那么就需要私有。

  • python里面类的私有,在属性或方法前面添加2个下划线前缀"__"就代表该属性或方法只能在类内部使用。

2,继承

面向对象的3大特征,封装、继承、多态。

  • 概念:子类拥有父类里面所有的方法和属性,然后子类扩展自己特有的方法和属性,不会影响到父类。
  • 定义类时,如果没有父类,建议统一继承自object
  • 在继承方式上分单继承和多继承,这个是其他语言都不一定支持的,反正C#只能单向继承,继承的目的就是较少重复代码
  • 继承的语句如下:

  • 子类是父类的继承,父类是子类的基类。
  • 传递性:B继承自A,C继承自B,C就拥有AB全部的属性和方法
#单继承
class 子类名(父类名称):

    pass
#多继承
class 子类名(父类名称, 父类名称...)
    pass
#Python 对于多继承,可采用内置属性__mro__进行查询,查询方法的调用顺序,找到就执行,不会再继续找
#如果都没有找到,报错。

3,多态

多态 以继承和重写为前提,没有继承和重写,谈不上多态。

  • 不同的子类实例,调用相同的方法,出现不同的执行结果。(关键点在于重新)
  • 重写:父类里的方法不能满足时,可以重新,关键字是override,重写时名称相同,重写后调用会放弃父类的方法。

4,类创建过程

  • 第一步、设计一个类
  • 第二步、创建对象,创建出来的这个真实的对象就叫类的实例。创建的过程叫做实例化,先初始化(走构造函数或析构函数,类似其他语言的Load,vue的初始化过程),再分配内存空间。
  • 第三步、实例的属性和方法其实就是类的属性和方法。
  • 每一个实例在内存都有自己独立的空间存储信息
  • 静态方法:既不需要访问属性,也不需要访问方法,用@staticmethod进行修饰。
class Card(object):
    # 类属性
    number = ""
    # 静态方法
    @staticmethod
    def show_number():
        print("181755")

    def __init__(self,name):
        self.name = name

    def change_number(self,val):
        #使用类名.修改 
        Card.number = val

phone = Card("电话卡")
phone.change_number()


5,单例

让类创建对象的时候,只创建唯一的一个实例,不能创建多个实例。

  • 只分配一次空间,只执行一次初始化动作。
  • 分配空间是__new__,重写即可实现,new是object提供的内置静态方法
  • 类初始化是__init__
class Card(object):
    # 类属性
    number = ""
    # 保存对象的引用
    on_line = None
    is_init = False

    # 静态方法
    @staticmethod
    def show_number():
        print("181755")

    def __init__(self,name):
        self.name = name        
        if not Card.is_init:
            Card.is_init = True
            # 多个实例时,也是初始化一次
            print("初始化成功")
    
    def __new__(cls, *args, **kwargs):
        if cls.on_line is None:
            # 调用类的方法,为第一个实例分配内存空间
            cls.on_line = super().__new__(cls)
        return cls.on_line

    def change_number(self,val):
        #使用类名.修改 
        Card.number = val
        print(f"号码修改成功{Card.number}")

phone = Card("电话卡")
phone.change_number('666666')
xiaomi = Card("小米卡")
xiaomi.change_number('777777')
# 此时xiaomi == phone
print(phone.number)
# True
print(phone == xiaomi)

提醒:在发布作品前请把不用的内容删掉(活动地址请保留)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值