本节目录如下:
1.10.1 类的定义与使用
1.10.2 私有成员与公有成员
1.10.3 数据成员
1.10.4 方法
1.10.5 属性
1.10.6 继承与重载
1.10.7 多态
1.10.8 特殊方法与运算符重载
class Car(object): #定义一个类,派生自 object类
def infor(self): #定义成员方法
print(" This is a car ")
定义了类之后,就可以用来实例化对象,并通过“对象名.成员”的方式来访问其中的数据成员或成员方法,例如:
>>>car=Car() #实例化对象
>>>car.infor() #调用对象的方法
This is a car
在Python中,可以使用内置方法isinstance()来测试一个对象是否为某个类的实例,
例如:
>>>isinstance(car, Car)
True
>>>isinstance(car,str)
False
最后,Python提供了一个关键字 pass,执行的时候什么也不会发生,可以用在类和函
数的定义中或者选择结构中,表示空语句。 如果暂时没有确定如何实现某个功能,或者为
以后的软件升级预留空间,可以使用关键字 pass来“占位”。 例如,下面的代码都是合
法的:
>>>class A:
pass
>>>def demo():
pass
>>>if 5>3:
Pass
>>>class A:
def __init__(self,value1=0,value2=0): #构造函数
self._value1 = value1
self.__value2 = value2 #私有成员
def setValue(self, value1,value2): #成员方法
self._value1 = value1
self.__value2 = value2 #在类内部可以直接访问私有成员
def show(self): #成员方法
print(self._value1)
print(self.__value2)
>>>a=A()
>>>a._value1 #在类外部可以直接访问非私有成员
0
>>>a._A__value2 #在外部访问对象的私有数据成员
0
在Python中,以下画线开头和结束的成员名有特殊的含义,类定义中用下画线作为
变量名和方法名前缀和后缀来表示类的特殊成员。
(1)_xxx:保护成员,不能用from module import* 导入,只有类对象和子类对象可
以访问这些成员。
(2)__xxx__:系统定义的特殊成员
(3)__xxx:类中的私有成员,一般只有类对象自己能访问,子类对象也不能访问到
这个成员,但在对象外部可以通过“对象名.__类名__xxx”这样的特殊方式来访问。
注意:Python 中不存在严格意义上的私有成员。
class Car(object):
price=100000 #属于类的数据成员
def __init__(self,c):
self.color=c #属于对象的数据成员
car1=Car("Red") #实例化对象
car2=Car("Blue")
print(car1.color, Car.price) #访问对象和类的数据成员
Car.price=110000 #修改类的属性
Car,name='QQ' #动态增加类的属性
car1.color="Yellow" #修改实例的属性
print(car2.color, Car.price, Car.name)
print(car2.color, Car.price, Car.name)
def setSpeed(self, s):
self.speed=s
动态为对象增加成员
import types
car1.setSpeed=types.MethodType(setSpeed,car1) #动态为对象增加成员方法
car1.setSpeed(50) #调用对象的成员方法
print(car1,speed)
利用类数据成员的共享性,可以实时获得该类的对象数量,并且可以控制该类可以创建的对象最大数量。 例如:
>>>class Demo(object):
total=0
def_new__(cls,*args,**kwargs): #该方法在__init__()之前被调用
if cls.total >=3: #最多允许创建3个对象
raise Exception('最多只能创建3个对象')
else:
return object.__new__(cls)
def__init__(self):
Demo.total=Demo.total+1
>>>class Root:
__total=0
def__init__(self,v): #构造函数
self.__value=v
Root.__total +=1
def show(self): #普通实例方法
print('self.__value:',self.__value)
print('Root.__total:',Root.__total)
@classmethod #修饰器,声明类方法
def classShowTotal(cls): #类方法
print(cls.__total)
@staticmethod #修饰器,声明静态方法
def staticshowTotal(): #静态方法
print(Root.__total)
>>>r=Root(3)
>>>r.classshowTotal() #通过对象来调用类方法
1
>>>r,staticShowTotal() #通过对象来调用静态方法
1
>>>r.show()
self._value:3
Root.__total:1
>>>rr=Root(5)
>>>Root.classShowTotal() #通过类名调用类方法
2
>>>Root.staticShowTotal() #通过类名调用静态方法
2
>>>class Test:
def__init__(self,value):
self.value=value #私有数据成员
@property #修饰器,定义属性,提供对私有数据成员的访问
def value(self): #只读属性,无法修改和删除
return self._value
#类定义
class people:
#定义基本属性
name = ''
age = 0
#定义私有属性,私有属性在类外部无法直接进行访问
__weight = 0
#定义构造方法
def __init__(self,n,a,w):
self.name = n
self.age = a
self.__weight = w
def speak(self):
print("%s 说: 我 %d 岁。" %(self.name,self.age))
#单继承示例
class student(people):
grade = ''
def __init__(self,n,a,w,g):
#调用父类的构函
people.__init__(self,n,a,w)
self.grade = g
#覆写父类的方法
def speak(self):
print("%s 说: 我 %d 岁了,我在读 %d 年级"%(self.name,self.age,self.grade))
#另一个类,多重继承之前的准备
class speaker():
topic = ''
name = ''
def __init__(self,n,t):
self.name = n
self.topic = t
def speak(self):
print("我叫 %s,我是一个演说家,我演讲的主题是 %s"%(self.name,self.topic))
#多重继承
class sample(speaker,student):
a =''
def __init__(self,n,a,w,g,t):
student.__init__(self,n,a,w,g)
speaker.__init__(self,n,t)
test = sample("Tim",25,80,4,"Python")
test.speak() #方法名同,默认调用的是在括号中排前地父类的方法
#执行以上程序输出结果为:
#我叫 Tim,我是一个演说家,我演讲的主题是 Python
如果你的父类方法的功能不能满足你的需求,你可以在子类重写你父类的方法,实例如下:
class Parent: # 定义父类
def myMethod(self):
print (‘调用父类方法’)
class Child(Parent): # 定义子类
def myMethod(self):
print ('调用子类方法')
c = Child() # 子类实例
c.myMethod() # 子类调用重写方法
# 执行以上程序输出结果为:
# 调用子类方法