类和对象
面向过程和面向对象的编程
面向过程的编程:函数式编程,c程序等
面向对象的编程:c++,JAVA ,python等
类和对象:是面向对象中的两个重要概念
类:是对事物的抽象,比如:汽车模型(某一类事物的描述,属性和方法)
对象:是类的一个实例,比如:qq轿车,大客车
范例说明:
汽车模型可以对汽车的特征和行为进行抽象,然后可以实例化为一台真实的汽车体现出来
Python类的定义:
python类的定义:
使用class关键字定义一个类,并且类名的首字母要大写;
当程序员需要创建的类型不能用简单类型表示时就需要创建类;
类把需要的变量和函数组合在一起, 这种包含称之为“封装”;
python类的结构:
>>>class 类名:
... 成员变量
... 成员函数
...
类的创建:范例
#!/usr/bin/python #coding:utf8 class Ren: #class关键字,类别首字母大写,这样写class Ren():也可以 name = "人" #属性 high = "一人高" #属性 wight = "一人重" #属性 def run(self): #成员函数定义 print "跑步"
#注意类当中定义成员函数时和外边定义函数时有区别,里边必须有一个形参,用来传递类当中的属性和方法,但调用的时候是不需要传参的
对象的创建:
创建对象的过程称之为实例化,当一个对象被创建后,包含三个方面的特性:对象的句柄、属性和方法。
句柄用于区分不同的对象;
对象的属性和方法与类中的成员变量和成员函数对应
#!/usr/bin/python #coding:utf8 class Ren: name = '人' high = '一人高' wight = '一人重' def run(self): #self 表示自己的类别 print '跑步' zhangsan = Ren() #从Ren 的类别中实例化一个对象 print zhangsan
[root@zabbix class]# python class.py <__main__.Ren instance at 0x7ff7f80110e0> #instance 实例 #列别中的实例(对象) #对象zhangsan具有属性和方法,zhangsan的属性就是类别中Ren的成员变量,方法就是类别中的函数
#属性的访问 (通过对象.)
..... print zhangsan.high [root@zabbix class]# python class.py 一人高
#对象属性的重新赋值
....... zhangsan.name = "张三" print zhangsan.name [root@zabbix class]# python class.py 张三
#注意:对象是从类别中实例化出来的,它具有类别的属性和方法,同时对象也是一个个体,可以有不一样的.
zhangsan.money = "10000" print zhangsan.money [root@zabbix class]# python class.py 10000
Python对象的体系结构:
-经典对象:内部由属性和方法组成,属性可以是数据类型也可以是函数类型。
如果属性为函数则该属性就是一个方法。
-新型对象-定义新型对象,必须继承object方法class_name(object)
新型对象提供了对类方法和静态方法的支持
.... class Ren(object):
类的属性:
类有属性和方法组成,类的属性是对数据的封装,类的方法则是对类的行为的封装。类的属性按使用范围分为私有属性和公有属性,类的属性范围取决于属性的名称 。
公有属性:所谓共有属性就是在类中和类外调用的属性
#!/usr/bin/python #coding:utf8 class Ren(object): name = '人' #公有属性 high = '一人高' wight = '一人重' def run(self): print self.name #调用内部属性,self代表本身,访问自己,调用类的属性 print '跑步' if __name__ == '__main__': zhangsan = Ren() zhangsan.name = "张三" print zhangsan.name #外部访问 zhangsan.run() print Ren.name #通过类名访问属性
私有属性:不能被类以外的函数调用
#!/usr/bin/python #coding:utf8 class Ren(object): name = '人' high = '一人高' wight = '一人重' __money = '1000' #私有属性 def run(self): print self.name print '跑步' if __name__ == '__main__': zhangsan = Ren() zhangsan.name = "张三" print zhangsan.__money #此处打印私有属性 [root@zabbix class]# python class.py Traceback (most recent call last): File "class.py", line 15, inprint zhangsan.__money AttributeError: 'Ren' object has no attribute '__money' #无法调用
#!/usr/bin/python #coding:utf8 class Ren(object): name = '人' high = '一人高' wight = '一人重' __money = '1000' def run(self): print self.name print '跑步' def say(self): #内部方法中调用 print self.__money if __name__ == '__main__': zhangsan = Ren() zhangsan.name = "张三" print zhangsan.say() #通过内部调用方法显示,实现对数据的封装、隐藏
(可以通过instance._classname_attribute方式访问,但只用于调式程序)
print zhangsan._Ren__money
定义方式:以“__”双下划线开始的成员变量就是私有属性,否则就是公有属性
内置属性:有系统在定义类的时候默认添加的,由前后两个下划线构成__dict__,__module__
...... print Ren.__dict__ [root@zabbix class]# python class.py 人 ################################################## {'high': '\xe4\xb8\x80\xe4\xba\xba\xe9\xab\x98', '__module__': '__main__', 'run':, 'name': '\xe4\xba\xba', '__dict__': , '__weakref__': , '__doc__': None, 'wight': '\xe4\xb8\x80\xe4\xba\xba\xe9\x87\x8d', 'say': , '_Ren__money': '1000'}
类的方法:
方法的定义
和函数定义一样,但是需要self作为第一参数
类方法也分为:公有方法和私有方法
私有方法:不能被外部类和方法调用,私有方法的定义和私有属性 的定义都是一样的,在方法的前面加上“__”双下划线就可以了。
#!/usr/bin/python #coding:utf8 class Ren(object): name = '人' __money = '我有十块钱' def run(self): #公有方法 print self.name print '跑步' def say(self): print self.__money def ___lie(self): #私有方法 print "我很欣赏你" if __name__ == '__main__': zhangsan = Ren() zhangsan.name = "张三" zhangsan.say() #可以打印 zhangsan.__lie() #无法打印
....... def say(self): #通过公有方法间接调用 print self.__money self.__lie() #self代表类本身
#如果要获取多个私有属性的值,可以通过传参
....... def get(self,x): #添加形参 if x == "money": return self.__money else: return self.__age def __lie(self): print "我很欣赏你" ....... if __name__ == '__main__': zhangsan = Ren() zhangsan.name = "张三" zm = zhangsan.get('age') #通过get方法取值 print zm
#通过方法设置私有属性的值
#!/usr/bin/python #coding:utf8 class Ren(object): name = '人' __age = 30 def set(self,x): #通过方法设置值 self.__age = x if __name__ == '__main__': zhangsan = Ren() zhangsan.name = "张三" zhangsan.set(20) #修改值 print zhangsan._Ren__age #打印值
类方法:被classmethod()函数处理的函数,能被类所调用,也能被对象所调用(是继承关系)
#!/usr/bin/python #coding:utf8 test = "globale" class Ren(object): name = '人' __money = '我有十块钱' def run(self): print '跑步' if __name__ == '__main__': print Ren.name #直接访问公有的属性是可以 print Ren.run() #直接访问公有的方法是不可以的 [root@zabbix class]# python 1.py 人 Traceback (most recent call last): File "1.py", line 12, inprint Ren.run() TypeError: unbound method run() must be called with Ren instance as first argument (got nothing instead) #类型错误,run()方法必须作为一个实例调用
可以通过函数处理,直接调用
..... def moRi(self): print "世界末日" mr = classmethod(moRi) #通过classmethod 转换,需另起名 if __name__ == '__main__': print Ren.name print Ren.mr() #直接调用(动态,不占用内存)
静态方法:相当于“全局函数”,可以被类直接调用,可以被所有实例化对象共享,通过staticmethod()定义,静态方法没有“self”语句
def moRi(): #静态方法不需要self print "世界末日" mr = staticmethod(moRi) #通过staticmethod 转换 if __name__ == '__main__': print Ren.name print Ren.mr() #注意不需要self调用类本身,表示运行类的时候,所有内部的属性和方法已预先加载,直接调用即可
通过装饰器,直接变为类方法
......... @classmethod #装饰器 def cass(self): print "动态" @staticmethod #装饰器 def satic(): print "静态" if __name__ == '__main__': print Ren.name print Ren.cass() print Ren.satic()
self参数:
用于区分函数和类的方法的(必须有一个self),self参数表示指示对象本身。