python笔记(5)---面向对象(1)
类的定义
和所有的面向对象语言一样,python也有其面向对象的管理的方式:class,其基本的模型如下写法:
class Myclass:
def __init__(self):
pass
def memfun(self):
pass
对于上面的类的基本框架可以看出 多了一个关键字 class 和一个加了下划线的函数init
- 其中class 关键字是类的声明也就是说是如下的:
class classname:
- init()函数类似于其他语言中的构造函数
class father:
def __init__(self,name,age):
self.name=name
self.age=age
如上所示我们创建了一个father类,这个类的构造函数有三个参数 self,name,age(解释如下):
self:self是对于类中的每一个函数(成员函数构造函数)都要写的一个关键字,写升self之后才可以紧跟着其他的参数
除了self参数之外的所有参数全部当作普通函数的参数进行对待.
在类中定义一个变量供类中所有的成员函数进行访问的话,可以写作,self.name=name,也就是说创建了一个name的变量可以在类中所有的地方访问,如下所示:
class father:
def __init__(self,name,age):
self.name=name
self.age=age
def get(self):
print("My father name is {},age is {}".format(self.name,self.age))
我们定义了一个 get()的成员函数,用于打印father类的姓名和年龄,那么在类中成员函数中定义参数的时候,也要加上self关键字之后然后增加其他的参数(和普通函数一样).
实例的创建
创建对象
还是上面的father类,我们考虑对象的创建:
f=father("xiaohua",19)
上面的代码我们创建了一个father对象,第一个参数代表是father的姓名,第二个参数代表的是father的年龄,这样就创建了一个对象,注意初始化对象的时候参数的使用和类中的__init__()函数的参数是一样的,这样也就解释了为什么__init__()函数是构造函数.
对象的使用
假如我们对father类增加了一些功能如下:
class father:
def __init__(self,name,age):
self.name=name
self.age=age
def get(self):
print("My father name is {},age is {}".format(self.name,self.age))
def addage(self): #年龄增加的模块
self.age+=1
#定义一个father对象
f=father("xiaohong",19)
#调用类中的方法采用'.'的形式进行调用
f.get() #打印信息
f.addage() #father年龄增加
类的权限问题
假如我们定义了一个类 girlfriend 类中有些东西不能再类的使用中被外部用户看见,比如 girlfriend类中有一个生气的属性,这个属性可以被外部对象看见, 但是girlfriend 类中 生气的原因的属性就不能被外部对象可见,但是怎么进行沟通呢?假如有一个boyfriend类,这个类有一个 Gauss函数用来猜测 girlfriend 为什么生气的原因,那么我们怎么把girlfriend类的生气原因的属性定义为 只对类自己可见呢?
class girlfriend:
def __init__(self,name,age,p):
self.name=name
self.age=age
self.prop=p #生气属性值
self.__why="happy" #如果不生气就是happy
def mad(self):
#女朋友不生气的原因只有不到0.1,0.9的时候都在生气
if self.prop>0.1:
return True
else:
return False
#为什么生气
def __why(self):
if self.mad():
#因为我也不知道所以返回None
return None
else:
return self.__why
我们使用一下这个类:
g=girlfriend("zhenzhen",19,0.01)
g.mad() #生气了
#查看原因
#g.why()#error 因为原因是不可以见的
#查看是否开心
print(g.__why1) #error 生气的原因都不可见 怎么可见开心的原因
总结一下:对于一个类想定义对用户不可见的函数和变量只需要在想定义的变量和函数名称前写上 '__'即可如上所示
[注:]
由于python中不同于c和c++的有垃圾回收机制,所以没有析构函数一说!!