python学习第22天

时间:2020-05-28
本文章向大家介绍python学习第22天,主要包括python学习第22天使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

一.面向对象 - 多态

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

关键字: 继承 , 改写

二.魔术方法

2.1__ new __ 魔术方法

触发时机:实例化类生成对象的时候触发(触发时机在__ init __之前)

功能:控制对象的创建过程

参数:至少一个cls接受当前的类,其他根据情况决定

返回值:通常返回对象或None

1.基本语法

class MyClass1(object):
   def __new__(cls):
      print(cls)
      # (1)借助父类object 类.方法()
      # obj = object.__new__(cls)
      # 返回本类自己的对象
      # return obj
      # (2)返回其他类的对象
      # return obj
      # (3)不返回任何对象
      return None
      
obj = MyClass1()
print(obj)
# print(obj.a)

2.new方法的触发时机要快于init

new 用来创建对象

init 用来初始化对象(前提是有对象)

先创建对象,再去初始化对象,所以new快于init

class Boat():
   def __init__(self):
      print(2)
      
   def __new__(cls):
      print(1)
      return object.__new__(cls)

obj = Boat()
# 打印
1
2

3 . new方法的参数要和init方法一一对应

一个参数

class Boat():
   def __new__(cls,name):
      return object.__new__(cls)
   
   def __init__(self,name):
      self.name = name
      
obj = Boat("泰坦尼克号")
print(obj.name)

多个参数(new可以用*args,**kwargs来收集参数)

class Boat():
   def __new__(cls,*args,**kwargs):
      return object.__new__(cls)
   
   def __init__(self,name,a,b,c,d,e):
      self.name = name
      
obj = Boat("泰坦尼克号",2,3,4,5,6)
print(obj.name)

4.注意点

如果new返回的不是本类的对象,则不会触发init构造方法

class MyClass():
   a = 1
other_obj = MyClass()

class Boat():
   def __new__(cls):
      return other_obj
   
   def __init__(self):
      print("构造方法被触发~")

obj = Boat()
# 打印 啥也没有 new返回的是其他类的对象 不触发init

原文地址:https://www.cnblogs.com/yunchao-520/p/12980927.html