多态
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