一、对象
python是面向对象编程的,对象可以理解为一系列数据以及访问和操作这些数据的方法。
与对象属性相关联的函数称为方法。
>>>object.get_price() #方法
使用对象的好处有:多态、封装、继承。
多态:不需要知道变量指向哪种对象,也可以对其操作。
>>> def add(x,y): #可以使用不同类型的参数调用函数
return x+y
>>> add(1,7)
8
>>> add('yxd','hy')
'yxdhy'
封装:向外部隐藏了内部的细节。
多态与封装的区别:多态让你无需知道对象的类型就能调用其方法,封装是让你无需知道对象的构造就能使用它。
要让方法或者属性成为私有的(不能从外部访问),只需要让其名称以两个下划线打头。
继承:基于通用类创建出专有类。
二、类
类是一种对象,每个对象都属于特定的类,并被称为该类的实例。当一个类的对象为另一个对象的子集,前者为子类,后者为超类。
>>> class Person:
def set_name(self,name): #self指向对象本身;
self.name=name
def get_name(self):
return self.name
>>> foo=Person() #foo作为第一个参数自动传递;这个参数就是self;
>>> foo.set_name("yxd")
>>> foo.get_name()
'yxd'
子类扩展了超类:
>>> class Filter:
def init(self):
self.blocked=[]
def filter(self,sequence):
return [x for x in sequence if x not in self.blocked]
>>> class SPAMFilter(Filter): #直接继承超类的方法定义;
def init(self): #子类重写超类的方法;
self.blocked=[1]
>>> f=Filter()
>>> f.init()
>>> f.filter([1,2,3])
[1, 2, 3]
>>> s=SPAMFilter()
>>> s.init()
>>> s.filter([1,2,3])
[2, 3]
>>> issubclass(SPAMFilter,Filter) #判断另一个类是否为另一个类的子类
True
>>> SPAMFilter.__bases__ #求一个类的基类
(<class '__main__.Filter'>,)
>>> s=SPAMFilter() #判断对象是否为特定类的实例
>>> isinstance(s,SPAMFilter)
true
>>> s.__class__ #判断对象属于哪个类
<class '__main__.SPAMFilter'>
抽象基类:不能被实例化的类,只能被继承。定义子类的一组方法。
@this被称为装饰器;
@abstractmethod 标记方法为抽象,在子类中必须实现的方法。
>>> class Talker(ABC):
@abstractmethod #抽象方法
def talk(self):
pass
>>> class Kingget(Talker):
pass
>>> k=Kingget() #不能实例化
Traceback (most recent call last):
File "<pyshell#67>", line 1, in <module>
k=Kingget()
TypeError: Can't instantiate abstract class Kingget with abstract methods talk
>>> class Kingget(Talker): #重写了抽象方法才能实例化
def talk(self):
print("Ni!")
>>> k=Kingget()
>>> k.talk()
Ni!
三、方法
构造函数: __init__
(左右各两个下划线),将在对象创建后自动调用
>>> class FooBar:
def __init__(self,values=42): #构造函数
self.somevar=values
>>> f=FooBar("yxd")
>>> f.somevar
'yxd'
重写构造函数必须调用超类的构造函数;
>>> class Bird:
def __init__(self):
self.hungry=True
def eat(self):
if self.hungry:
print('Aaaah')
self.hungry=False
else:
print("No,thinks!")
>>> class SongBird(Bird): #重写构造函数,老版本
def __init__(self):
Bird.__init__(self)
self.sound='Aquawk!'
def sing(self):
print(self.sound)
>>> sb=SongBird()
>>> sb.sing()
Aquawk!
>>> sb.eat()
Aaaah
>>> sb.eat()
No,thinks!
>>> class SongBird(Bird): #重写构造函数 用super() 新版本
def __init__(self):
super().__init__()
self.sound='Aquawk!'
def sing(self):
print(self.sound)