Python3学习(八)

多态

Python中多态是指一类事物有多种形态。比如动物有多种形态,人,狗,猫,等等。文件有多种形态:文本文件,可执行文件。

举个栗子:

class Dog(object):
	def intro_self(self):
		print("大家好,我是大黄")
class Cat(object):
	def intro_self(self):
  		print("大家好,我是小喵")	
def introduce(temp):
	temp.intro_self()
	
dog = Dog()
cat = Cat()

introduce(dog)
introduce(cat)
ubuntu@ubuntu16:/work/python/9-day$ python3 2-多态.py 
大家好,我是大黄
大家好,我是小喵

类属性和实例属性

什么是类属性?什么是实例属性?

由于Python是动态语言,根据类创建的实例可以任意绑定属性。
给实例绑定属性的方法是通过实例变量,或者通过self变量:

如下图所示:
在这里插入图片描述

类属性:可以简单对比到C语言中的全局变量,各个函数都可以去操作
实例属性:可以简单比对到C语言中函数内部的局部变量,仅可在函数内使用,函数之间不可以共享。

实例方法,类方法,静态方法

上例子:

1                                                                                                                                                                                            
  2 class Game(object):
  3 
  4     #类属性
  5     num = 0
  6 
  7     def __init__(self): #必须要有参数self,并且参数代表类所创建的对象
  8         #实例属性
  9         self.num = 1
 10         self.name = "laowang"
 11 
 12     #类方法
 13     @classmethod
 14     def add_num(cls):#必须要有参数cls,参数代表类
 15         cls.num += 100
 16 
 17     #静态方法
 18     @staticmethod
 19     def print_menu():#静态方法可以不需要参数,一般与类和对象没有太大的关联
 20         print("*"*50)
 21         print("    创越火线   ")
 22         print("    1.开始游戏   ")
 23         print("    2.结束游戏   ")
 24         print("*"*50)
 25 
 26 game = Game()
 27 
 28 Game.add_num()#可以通过类的名字调用类方法
 29 print(Game.num)
 30 game.add_num()#还可以通过该类创建的对象,去调用这个类的方法
 31 print(game.num)#先去找实例属性中有没有num,有的话打印实例属性的值,没有的话,找类属性,有的话打印类属性的值
 32 print(Game.num)
 33 
 34 Game.print_menu()#通过类去调用静态方法
 35 game.print_menu()#通过实例对象去调用静态方法
#结果:
ubuntu@ubuntu16:/work/python/9-day$ python3 4-实例--静态方法.py 
100
1
200
**************************************************
    创越火线   
    1.开始游戏   
    2.结束游戏   
**************************************************
**************************************************
    创越火线   
    1.开始游戏   
    2.结束游戏   
**************************************************

__new__方法

我们之前有提到过的两个下划线开头和结尾的方法有哪些?还记得吗?

  2 class test(object):
  3     def __init__(self):#创建实例对象的过程中会调用
  4         print("----init方法----")
  5 
  6     def __str__(self):#对象的描述信息
  7         print("----str方法----")
  8 
  9     def __del__(self):#退出的时候调用
 10         print("----del方法----")
 11 
 12     def __new__(cls):#??
 13         print("----new方法----")
 14 
 15 
 16 T = test()
#结果:
ubuntu@ubuntu16:/work/python/9-day$ python3 5-new方法.py 
----new方法----

我们会发现为什么没有调用__init__,__del__函数?

接下来我们来讲讲__new__方法。

只有继承于object的新式类才能有__new__方法,new__方法在创建类实例对象时由Python解释器自动调用,一般不用自己定义,Python默认调用该类的直接父类的__new__方法来构造该类的实例,如果该类的父类也没有重写__new,那么将一直按此规矩追溯至object的__new__方法,因为object是所有新式类的基类,若需要自定义__new__方法,一般用法如下:

  2 class test(object):
  3     def __init__(self):#创建实例对象的过程中会调用
  4         print("----init方法----")
  5 
  6     def __str__(self):#对象的描述信息
  7         print("----str方法----")
  8 
  9     def __del__(self):#退出的时候调用
 10         print("----del方法----")
 11 
 12     def __new__(cls):
 13         print("----new方法----")
 14         return object.__new__(cls)
 15 
 16 T = test()
#结果:
ubuntu@ubuntu16:/work/python/9-day$ python3 5-new方法.py 
----new方法----
----init方法----
----del方法----

看到这个效果和之前我们想的一样了。
说明新式类object中有__new__方法,并且功能是返回创建的实例对象的引用。我们是重写了__new__方法。

创建单例对象

我们讲了__new__方法,什么作用呢?

举个例子:

  2 class Dog(object):
  3     pass
  4 
  5 a = Dog()
  6 print(id(a))
  7 b = Dog()
  8 print(id(b))
#结果:
ubuntu@ubuntu16:/work/python/9-day$ python3 6-单例对象.py 
139657892333104
139657892333272

我们看到创建了两个对象,所有id不一样,但是在实际应用中,对于一样的类,我们创建对象使用类方法时,不希望多次创建对象,这样会消耗很多资源。那么我们就需要创建单例对象来解决这个问题。

  2 class Dog(object):
  3 
  4     __instance = None #私用类属性
  5 
  6     def __new__(cls):
  7         if cls.__instance == None:
  8             cls.__instance = object.__new__(cls)
  9             return cls.__instance
 10         else:
 11             #return 上一次创建的对象的引用
 12             return cls.__instance
 13 a = Dog()
 14 print(id(a))
 15 b = Dog()
 16 print(id(b))
#结果:
ubuntu@ubuntu16:/work/python/9-day$ python3 6-单例对象.py 
140120421988056
140120421988056
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

linux顿悟吧

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值