类和对象


        面向过程和面向对象的编程

               面向过程的编程:函数式编程,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, in 
    print 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, in 
    print 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参数表示指示对象本身。