Object-Oriented面向对象编程——面向对象编程,简称OOP,是一种编程思想。OOP把对象作为程序的基本单位。对象包含数据和函数类以及对数据进行操作的实例。这是面向对象最重要的概念,就是把面向对象的概念具体化。这里我们先定义一只狗,狗必须有名字和年龄。#这里我们定义了一个狗类classDog(object):#__init__是初始化方法def__init__(self,name,age):self.name=nameself.age=age#让我们写另一个方法来打印狗的名字和agedefprint_dog(self):print('%s:%s'%(self.name,self.age))接下来调用这个类#我们先给dog赋值,name和agedog=Dog("xiaohua",12)#调用我们之前写的打印方法dog.print_dog()运行结果:xiaohua:12这样我们就简单封装了狗的数据,我们只需要知道我们创建的是实例变量当您需要传递狗的名字和年龄时。那么我们也可以在里面添加方法,调用方法的时候完全不用关心内部的运行原理。访问被限制在类内部,可以有属性和方法可以被外部代码调用。这样可以很好的隐藏内部的实现逻辑。但是,在上面的代码中,外部仍然可以自由修改实例中的属性值。如果我们希望内部属性不能被外部修改,可以在属性名前加上两个下划线__。在Python中,如果实例的变量名以__开头,则成为私有变量(private),只能在内部访问,不能在外部访问。类Dog(对象):def__init__(self,name,age):self.__name=nameself.__age=agedefprint_dog(self):print('%s:%s'%(self.__name,self.__age))这里运行一下:dog=Dog("Xiaohua",12)dog.print_dog()print(dog.__name)运行结果:Xiaohua:12Traceback(mostrecentcalllast):File"D:/WorkSpace/python/test.py",line12,inprint(dog.__name)AttributeError:'Dog'objecthasnoattribute'__name'但是如果我们需要修改内部值怎么办?在这里我们可以创建新的方法,get_name和set_name。类Dog(对象):def__init__(self,name,age):self.__name=nameself.__age=agedefprint_dog(self):print('%s:%s'%(self.__name,self.__age))#获取__namedefget_name(self):returnself.__name#给__name赋值defset_name(self,name):self.__name=name再次运行:dog=Dog("LittleFlower",12)dog.print_dog()print(dog.get_name())运行结果:xiaohua:12xiaohua在Python中,像__xxx__这样的变量名,即双下划线开头,双下划线结尾的变量名,是特殊变量。可以直接访问特殊变量,而不是私有变量。一个下划线开头的实例变量名,比如_name,是可以被外部访问的,但是这样的变量的意思是告诉你,请不要随便访问我,我是一个私有变量。继承和多态性在OOP编程中,当我们定义一个新的类时,它可以继承现有的类。新类称为子类,继承类称为基类或父类。或超类(Baseclass,Superclass)。classPeople(object):defdrink(self):print('Peoplearedrinkingwater')classChinese(People):passclassJapanese(People):pass让我们在这里调用并运行它:Chinese=Chinese()chinese.drink()japanese=Japanese()japanese.drink()运行结果:PeoplearedrinkingwaterPeoplearedrinkingwater这里可以看出,由于People有一个drink方法,它的子类Chinese和Japanese继承了drink方法,什么都不做。获取对象信息1.使用type()函数使用type()函数可以获取任意类型的数据。如果要判断一个数据是否为函数,可以使用types模块中定义的常量,如:types.FunctionType、types.LambdaType。2、使用isinstance()函数isinstance函数判断一个对象是否属于该类型,或者是否位于该类型的父类继承链上。isinstance还可以判断一个变量是否是某种类型,可以把多种类型写成元组。三、使用dir()函数1、如果要获取一个对象的所有属性和方法,可以使用dir()函数。它返回一个包含字符串的列表。2、类似于“__xxx__”的属性和方法在Python中有特殊的用途,比如len()函数获取对象的长度。但其实在len函数内部,它会自动调用对象的__len__()方法,所以你可以在类中设置一个__len__()方法,让len返回你想要返回的长度。4、操作对象的状态,比如getattr()获取、setattr()设置和hasattr()有没有什么方法可以直接操作对象的状态。hasattr(obj,'x')#是否有属性'x'?setattr(obj,'y',18)#设置一个属性'y',值为18.getattr(obj,'y')#获取属性ygetattr(obj,'z',404)#获取属性z,如果不存在则返回默认值404。实例属性和类属性实例属性属于每个实例,互不干扰;类属性属于类,所有实例共享一个属性;实例属性和类属性不要重名,否则会产生难以发现的bug。