面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想。OOP把对象做为程序的基本单元,一个对象包含了数据和操做数据的函数python
这是面向对象最重要的概念,就是将面向对象的概念具象化。
这里咱们先定义一条狗,狗要有姓名和年龄。编程
# 咱们在这里定义一个狗的类 class Dog(object): # __init__ 为初始化方法 def __init__(self, name, age): self.name = name self.age = age # 咱们再写一个方法,打印狗的名字和年龄 def print_dog(self): print('%s: %s' % (self.name, self.age))
接下来咱们就调用一下这个类函数
# 咱们首先先给dog赋值,名字和年龄 dog = Dog("小花", 12) # 调用咱们以前写的打印方法 dog.print_dog() 运行结果: 小花: 12
这样咱们就简单的将狗进行了数据封装,咱们只须要知道咱们在建立狗的实例变量的时候须要传名字和年龄就能够了。
而后咱们还能够在里面增长方法,并且咱们在调用方法的时候根本不去关心内部的运行原理。设计
在Class内部,能够有属性和方法,而外部代码能够调用。这样就能够很好的隐藏了内部的实现逻辑。
但是,上面的代码中,外部仍是能够自由的修改实例中的属性值。
咱们但愿内部属性不能被外部修改的话,咱们就能够在属性名称前加上两个下划线__
。
在Python中,实例的变量名若是以__
开头,就变成了一个私有变量(private),只有内部能够访问,外部不能访问。code
class Dog(object): def __init__(self, name, age): self.__name = name self.__age = age def print_dog(self): print('%s: %s' % (self.__name, self.__age))
咱们这边运行一下:对象
dog = Dog("小花", 12) dog.print_dog() print(dog.__name) 运行结果: 小花: 12 Traceback (most recent call last): File "D:/WorkSpace/python/test.py", line 12, in <module> print(dog.__name) AttributeError: 'Dog' object has no attribute '__name'
不过若是咱们须要对内部的值进行修改的话怎么办呢?这里咱们能够新建方法,get_name和set_name。继承
class Dog(object): def __init__(self, name, age): self.__name = name self.__age = age def print_dog(self): print('%s: %s' % (self.__name, self.__age)) # 获取__name def get_name(self): return self.__name # 给__name赋值 def set_name(self, name): self.__name = name
这里咱们再运行一下:字符串
dog = Dog("小花", 12) dog.print_dog() print(dog.get_name()) 运行结果: 小花: 12 小花
__xxx__
的,也就是以双下划线开头,而且以双下划线结尾的,是特殊变量,特殊变量是能够直接访问的,不是private变量。_name
,这样的实例变量外部是能够访问的,可是,这样的变量意思是告诉你请不要随便访问我,我是私有变量。在OOP程序设计中,当咱们定义一个新class的时候,能够从已有的class继承,新的class称为子类(Subclass),而被继承的class称为基类、父类或超类(Base class、Super class)。get
class People(object): def drink(self): print('People are drinking water') class Chinese(People): pass class Japanese(People): pass
咱们这边调用运行一下:it
chinese = Chinese() chinese.drink() japanese = Japanese() japanese.drink() 运行结果: People are drinking water People are drinking water
这里能够看出来,因为People有drink方法,他的子类Chinese和Japanese什么都没有作,就继承了drink方法。
使用type()函数,能够获取任何数据的类型。若是要判断一个数据是否是函数,可使用types模块中定义的常量,如:types.FunctionType、types.LambdaType。
isinstance函数判断的是一个对象是不是该类型或位于该类型的父类继承链上。isinstance还能够判断一个变量是不是某些类型的一种,用元组写多种类型。
1.若是要得到一个对象所有的属性和方法,可使用dir()函数。它返回一个包含 字符串的list。
2.相似“__xxx__”的属性和方法在Python中都是有特殊用途的,好比len()函数获取对象的长度。但实际上,在len函数内部它会去自动调用对象的__len__()方法,因此,你能够在类中本身设定一个__len__()方法,让len返回你想要返回的长度。
如getattr() 获取、setattr() 设置 和hasattr() 有没有 方法,能够直接操做一个对象的状态。
hasattr(obj,'x') #有属性‘x’吗? setattr(obj,'y',18) #设置一个属性‘y’,值为18. getattr(obj,'y') #获取属性y getattr(obj,'z',404) #获取属性z,若是不存在,就返回默认值404.
实例属性属于各个实例全部,互不干扰;类属性属于类全部,全部实例共享一个属性;不要对实例属性和类属性使用相同的名字,不然将产生难以发现的错误。