5.8 继承(覆盖),多重覆盖,组合,魔法方法__init__,isinstance(),hasattr(),getattr(),setattr(),delattr(),__new__,__del__

感觉我的日记好像少了点自己的理解,今天尝试下

继承

继承就是子类可以保留父类的某些属性,若该属性在子类中发生变化,还可以将父类的该属性覆盖掉。如果子类中定义与父类同名的方法或属性,则会自动覆盖父类对应的方法或属性。
继承在定义类的时候添加
如:class Child(Parent):
表示Child继承Parent的类
eg:
在这里插入图片描述

输出:
在这里插入图片描述

在这里插入图片描述

输出:
在这里插入图片描述

下面通过一个例子来说明__init__被覆盖该怎么办:
eg:
在这里插入图片描述

在这里插入图片描述

调用:
在这里插入图片描述
输出:
在这里插入图片描述

会发现,在调用shark.move()时,会报错。错误中说Shark中没有所属变量x。
因为定义Shark的时候,其中__init__()将父类的_init__覆盖了,而父类中才会有x和y。

解决办法:
1.使用super()函数
在这里插入图片描述

super函数:可以保留原有父类属性的定义,还能改动子类的该属性。

2.在子类与父类重合的部分中,在子类的定义里调用未绑定的父类方法
未绑定:大概就是说可变的吧。。。
绑定:python中的方法需要有实例才能被调用
在这里插入图片描述
输出:
在这里插入图片描述

多重继承

多重继承:一个类可以同时继承其他多个类
eg:
在这里插入图片描述
输出:
在这里插入图片描述

组合

组合:把类的实例化放到一个新的类当中
eg:
在这里插入图片描述

可以看到:
在这里插入图片描述

self.turtle是在Pool类中,__init__函数中的变量,Turtle(x)是Turtle类的一个实例

输出:
在这里插入图片描述

当属性名和方法名相同时,则属性覆盖方法

issubclass(class,classinfo):检查class是否为classinfo的子类,是则返回true

一个类被认为是自身的子类。
classinfo可以是类对象组成的元组,只要class与其中任何一个候选类的子类,则返回True
eg:
在这里插入图片描述
输出:
在这里插入图片描述

isinstance(object,classinfo):检查object是否属于classinfo(实例属于类)

eg:
在这里插入图片描述
如果第二个参数不是类或类对象组成的元组,会抛出一个typeerror异常

输出:
在这里插入图片描述

hasattr(object,name):实例中有无为name的属性

eg:
在这里插入图片描述
需要用字符串将属性名引上
输出:
在这里插入图片描述

getattr(object,name[,default]):返回实例的指定属性值,若不存在 则打印default

eg:
在这里插入图片描述

输出:
在这里插入图片描述

setattr(object,name,value):设置对象中指定属性的值,若不存在则新建属性并给他赋值

在这里插入图片描述

输出:
在这里插入图片描述

delattr(object,name): 删除属性的值,若属性不存在则抛出异常

eg:
在这里插入图片描述

property和@property

这里直接给出博主的日志IP解释property

魔法方法

魔法方法是面向对象的python的一切,体现在他们总能够在适当的时候被自动调用

__init __

eg:
在这里插入图片描述
__ init __(self,x,y):这里的x,y是传入的参数,参数在类的实例化时给定
self.x&self.y是类实例化后的实例对象的局部变量
注意init()返回的是None,不要试图给__init__做任何的返回

输出:
在这里插入图片描述

__ new __()

当继承的类是不可改变类型并且我们需要对其进行修改时,需在子类重定义new,否则会调用基类的new
eg:
在这里插入图片描述
定义了一个新的string
输出:
在这里插入图片描述

__ del __:类似析构函数

del:并不是一个对象del都会调用__del__,当所有对该类的引用都被del之后,才会启动回收机制,调用__del__方法
eg:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果您希望在`print_object`方法中使用`isinstance`来检查`target_object`的类型,您可以按照以下方式修改代码: ```python class IOInterface: def print_object(self, target_object): if isinstance(target_object, Customer): print('Printing Customer object:') print('user_id:', target_object.user_id) print('user_name:', target_object.user_name) print('user_password:', target_object.user_password) print('user_register_time:', target_object.user_register_time) print('user_role:', target_object.user_role) print('user_email:', target_object.user_email) print('user_mobile:', target_object.user_mobile) elif isinstance(target_object, Admin): print('Printing Admin object:') print('user_id:', target_object.user_id) print('user_name:', target_object.user_name) print('user_password:', target_object.user_password) print('user_register_time:', target_object.user_register_time) print('user_role:', target_object.user_role) else: print('Object type not supported.') ``` 在上面的代码中,我们首先使用`isinstance`检查`target_object`的类型,如果它是`Customer`对象,则打印出所有的属性。如果它是`Admin`对象,则打印出除了`user_email`和`user_mobile`之外的所有属性。如果它是其他类型的对象,则打印出一条错误消息。 您可以像之前一样创建`Customer`和`Admin`对象,并使用`IOInterface`的`print_object`方法来打印它们的属性和值。例如: ```python # 创建customer对象 class Customer: def __init__(self, user_id, user_name, user_password, user_register_time, user_role, user_email, user_mobile): self.user_id = user_id self.user_name = user_name self.user_password = user_password self.user_register_time = user_register_time self.user_role = user_role self.user_email = user_email self.user_mobile = user_mobile customer = Customer(1, 'John', 'password', '2021-01-01', 'customer', 'john@example.com', '1234567890') # 创建admin对象 class Admin: def __init__(self, user_id, user_name, user_password, user_register_time): self.user_id = user_id self.user_name = user_name self.user_password = user_password self.user_register_time = user_register_time self.user_role = 'admin' admin = Admin(2, 'Admin', 'admin123', '2021-01-01') # 打印customer对象 io = IOInterface() io.print_object(customer) # 打印admin对象 io.print_object(admin) ``` 输出结果如下: ``` Printing Customer object: user_id: 1 user_name: John user_password: password user_register_time: 2021-01-01 user_role: customer user_email: john@example.com user_mobile: 1234567890 Printing Admin object: user_id: 2 user_name: Admin user_password: admin123 user_register_time: 2021-01-01 user_role: admin ``` 请注意,此方法仅支持`Customer`和`Admin`对象。如果您想要支持其他类型的对象,请在`print_object`方法中添加适当的检查。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值