对象:属性(静态特征)和方法(动态动作)
类和对象的关系
eg.盖房子
图纸是类,按照图纸盖的每栋房子为对象
面向对象的特征
封装:把数据和函数代码都封装到一起
继承:子类共享父类的属性和方法
class Mylist(list):
pass
多态:不同对象对同一方法响应不同的行动
eg. 移动:不同动物有不同的移动方式,如乌龟是爬,老虎是跑...
多个类具有同一种方法,但是实例化后的对象调用该方法实现不同的结果。
self
刚才的例子中,类是图纸,对象是按照图纸盖的每栋房子,那么self 就是每栋房子的门牌号,可以区分不同的房屋。
当一个对象的方法被调用时,对象将自身作为第一个参数传给self,程序接收到self之后就知道是哪个对象在调用类的方法。
class Ball:
def setName(self,name):
self.name = name
def fun(self):
print("我叫%s,..." % self.name)
结果如下:
In[1]: a = Ball()
In[2]: a.setName('球A')
In[3]: a.fun()
my name is 球A
In[4]: b = Ball()
In[5]: b.setName('球B')
In[6]: b.fun()
my name is 球B
实例化对象球A和球B,对它们分别调用fun函数,print的结果是不同的。
过程如下:
调用a.fun()时,实际上a已经通过隐藏的self参数传入类对象中,类对象的self就接收到了,self.name就会找到a对象的name,进行接下来的操作。
魔法方法
__init__ (self) # 构造方法
eg.
class Ball:
def __init__(self, name):
self.name = name
def fun(self):
print('my name is %s' % self.name)
结果如下:
In[1]: a = Ball('球A')
In[2]: a.fun()
my name is 球A
使用该魔法方法与之前有什么差别呢?
——可以在实例化对象的时候直接给name赋值。
公有与私有
在Python中定义私有变量只需要在变量名或函数名前添加两道下划线,这个函数或变量就变成了私有的了。
class Person:
name = 'a'
In[2]: p = Person()
In[3]: p.name # 不要加括号!!!
Out[3]: 'a'
如果在name前加__,该属性就变成了私有的,按普通方法无法调用,所以可以加一个函数,通过该函数调用属性
class Person:
__name = 'a'
def getName(self):
return self.__name
In[5]: q = Person()
In[6]: q.getName()
Out[6]: 'a'
# 用以下方法也行
In[7]: q._Person__name