Python中的面向对象
Python是一门面向对象的语言,简单总结一下Python中的面向对象一些特征。
1.创建类:
写一个简单的例子:
class Student: '所有学生的基类' stuCount = 0//类变量 def __init__(self, name, student_id): self.name = name self.student_id = student_id Student.stuCount += 1 def displayCount(self): print "Total Student %d" % Student.stuCount def display(self): print "Name : ", self.name, ", Stuendt_id: ", self.student_id
1)empCount 变量是一个类变量,它的值将在这个类的所有实例之间共享, Employee.empCount 访问。
2)第一种方法__init__()方法是一种特殊的方法,被称为类的构造函数或初始化方法(与其他的面向对象的实例化有些不同),当创建了这个类的实例时就会调用该方法
3)self 代表类的实例,self 在定义类的方法时是必须有的,虽然在调用时不必传入相应的参数。
2.创建实例对象:
类似于函数调用
"创建 Student 类的第一个对象" stu1 = Student("zhangsan", 00001) "创建 Student 类的第二个对象" stu2 = Student("wnagwu", 00002)
用“ . ”来调用属性
还可以直接增添,修改,删除属性
stu1.age = 7 # 添加一个 'age' 属性 stu1.age = 8 # 修改 'age' 属性 del stu1.age # 删除 'age' 属性
你也可以使用以下函数的方式来访问属性:
getattr(obj, name[, default]) : 访问对象的属性。
hasattr(obj,name) : 检查是否存在一个属性。
setattr(obj,name,value) : 设置一个属性。如果属性不存在,会创建一个新属性。
delattr(obj, name) : 删除属性。
3.类的继承:
语法:class 派生类名 (基类名)基类名写在括号里,基本类是在类定义的时候,在元组之中指明的。
在python中继承中的一些特点:
1)在继承中基类的构造(__init__()方法)不会被自动调用,它需要在其派生类的构造中亲自专门调用。
2)在调用基类的方法时,需要加上基类的类名前缀,且需要带上self参数变量。区别于在类中调用普通函数时并不需要带上self参数
3)Python总是首先查找对应类型的方法,如果它不能在派生类中找到对应的方法,它才开始到基类中逐个查找。(先在本类中查找调用的方法,找不到才去基类中找)。
类的多继承:
语法:
class SubClassName (ParentClass1[, ParentClass2, ...]): 'Optional class documentation string' class_suite
例子:
parentAttr = 100
def __init__(self):
print "调用父类构造函数"
def parentMethod(self):
print '调用父类方法'
def setAttr(self, attr):
Parent.parentAttr = attr
def getAttr(self):
print "父类属性 :", Parent.parentAttr
class Child(Parent): # 定义子类
def __init__(self):
print "调用子类构造方法"
def childMethod(self):
print '调用子类方法 child method'
c = Child() # 实例化子类
c.childMethod() # 调用子类的方法
c.parentMethod() # 调用父类方法
c.setAttr(200) # 再次调用父类的方法
c.getAttr() # 再次调用父类的方法
4.类的属性和方法
1)类的私有属性:
__private_attrs:两个下划线开头,声明该属性为私有,不能在类的外部被使用或直接访问。在类内部的方法中使用时 self.__private_attrs。
2)类的方法
在类的内部,使用def关键字可以为类定义一个方法,与一般函数定义不同,类方法必须包含参数self,且为第一个参数
3)类的私有方法:
__private_method:两个下划线开头,声明该方法为私有方法,不能在类地外部调用。在类的内部调用 self.__private_methods
class JustCounter: __secretCount = 0 # 私有变量 publicCount = 0 # 公开变量 def count(self): self.__secretCount += 1 self.publicCount += 1 print self.__secretCount counter = JustCounter() counter.count() counter.count() print counter.publicCount print counter.__secretCount # 报错,实例不能访问私有变量
5.单下划线、双下划线、头尾双下划线说明:
1)__foo__: 定义的是特列方法,类似 __init__() 之类的。
2)_foo: 以单下划线开头的表示的是 protected 类型的变量,即保护类型只能允许其本身与子类进行访问,不能用于 from module import *
3)__foo: 双下划线的表示的是私有类型(private)的变量, 只能是允许这个类本身进行访问了。