活动地址: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)
提醒:在发布作品前请把不用的内容删掉(活动地址请保留)