python面向对象实例
——王宇阳 总结 (Code_boy)2018年11月16日
1 class Person: 2 name='xxx' 3 age=20 4 5 p=Person() #p为实例对象 6 print(p.name,p.age) 7 p.name="yyy" 8 p.gender='male' 9 print(p.name,p.gender,p.age) 10 print(Person.name,Person.age)
#p(实例对象)对值得修改不影响Person类中的内容
Person.age='30'
print(Person.age)
#class Person (类) 对值得修改将该影响Person类中的内容
'''
#访问权限(类的属性)
'''
class Person: #Person中的name和age公有的
name = 'james'
age=20
#在python中规定在前面加两个下划线,就变为私有的
'''
'''
class Person:
__name = 'james' #私有的__name
age = 20
def show(self): #self >> 自己
print(self.__name,self.age) #自己访问自己 正常返回
p=Person ()
p.show() #需要调用除show()函数,否则会拒绝class中的show的执行
print(Person.__name) # 访问类中的私有属性 异常返回
print(p.age)
#出现私有的函数调用时,结果同样如此!私有的函数,元素只能在class中被使用
#常用的方法就是通过调用公有的函数来执行函数内的私有属性的调用
'''
#案例:编写个人信息并建立对象访问属性
1 class Person: 2 name = 'xxx' 3 gender = 'x' 4 age = 0 5 6 p=Person() 7 print(p.name,p.gender,p.age) 8 print(Person.name,Person.gender,Person.age) 9 10 p.name = 'A' 11 p.gender = 'Male' 12 p.age = 20 13 14 Person.name = 'B' 15 Person.gender = 'Female' 16 Person.age = 21 17 18 print(p.name,p.gender,p.age) #p实例对象属性 19 print(Person.name,Person.gender,Person.age) #Person类属性
#实例方法
'''
1 class Person: 2 age = 20 3 def show(self): 4 print (self.age) 5 6 p.Person()
#实例方法至少有一个参数,一般以名为(self)的变量作为该参数(名称可自定义)
#实例方法通过实例对象调用,例如:p.show()
#如果使用类名称调用,需要人为传递实例参数,例如:Person.show(p)
#实例方法被调用是要向他的第一个参数传递实例对象
1 class Person: 2 name = 'james' 3 age = 12 4 5 def getName(self): 6 return self.name 7 8 def getAge(self): 9 return self.age 10 11 p=Person() 12 print(p.getName(),p.getAge()) #实例属性对象调用 13 print(Person.getAge(p)) #类名称调用
1 def show(self,s): #参数传递 2 print(self,s) 3 4 p.show('hi') #'hi'值传递给s 5 Person.show(p,'hello') #hello 给 s'''
#类方法
1 class Person: 2 age = 20 3 @classmethod 4 def show(cls): 5 print(cls.age) 6 7 p=Person()
#类方法要使用 @classmethod 来修饰,而且第一个参数一般命名为cls(可另定名)
#类方法通常使用类的名称调用,例如:Person.show()
#类方法也可实例方法调用,例如:p.show()
#类方法调用时会向它的第一个参数传递类的名称
1 class Person: 2 __name = 'james' 3 __age = 12 4 5 @classmethod 6 def show(self): 7 print(self) 8 print(self.__name,self.__age) 9 10 Person.show() 11 p=Person() 12 p.show()'''
#静态方法
'''
定义:
1 class Person: 2 age = 20 3 @staticmethod 4 def show(): 5 print(Person.age) 6 7 p = Person()
#静态变量函数通过@staticmethod修饰
#通常采用类的名称或者实例来调用静态方法,例如:Person.show(),p.show()
#在调用静态函数时不会向函数传递任何参数
1 class Person: 2 __name = 'james' 3 __age = 12 4 5 @staticmethod 6 def show(): #静态不带参数 7 print(Person.__name) 8 9 p = Person() 10 Person.show() 11 p.show()
#类、实例、静态方法 不同——Person
1 class Person: 2 name = 'xxx' 3 gender = 'x' 4 age = 0 5 #实例方法 6 def instanceShow(self): 7 print(self.name,self.gender,self.age) 8 9 @classmethod #类方法 10 def classShow(cls): 11 print(cls.name,cls.gender,cls.age) 12 13 @staticmethod #静态方法 14 def staticShow(): 15 print(Person.name,Person.gender,Person.age) 16 17 18 p=Person() 19 p.instanceShow() #实例方法调用 20 Person.classShow() #类方法调用 21 Person.staticShow() #静态方法调用
实例方法一般用实例对象调用
类方法和静态方法一般用类名称调用
#对象初始化
'''
构造方法(函数)...>完成函数初始化
@ 构造方法__init__(self, ... )在生成对象时调用,
可以用来进行一些初始化操作,不需要显示去调用,系统默认执行
如果用户自己没有定义构造方法,系统就自己执行默认的额构造方法
__init__(self)在生成对象时调用
__del__(self)在释放对象时调用
1 class Person: 2 def __init__(self,n,a): 3 self.name=n 4 aelf.age=a 5 6 p=Person('xxx',20) 7 print(p.name,p.age)
@ 析构方法__del__(self)在释放对象时调用,可以在里面进行一些释放资源的操作
不需要显示调用
1 class Person: 2 def __init__(self,n,a): 3 self.name = n 4 self.age = a 5 def __del__(self): 6 print('__del__',self.name,self.age) 7 8 p=Person('xxx',20) 9 print(p.name,p.age) 10 11 class Person: 12 def __init__(self): 13 print("__init__",self) 14 def __del__(self): 15 print("__del__",self) 16 17 p=Person()
#__init__完成对象初始化
1 class Person: 2 def __init__(self,n,g,a): #n,g,a 传参单位 3 self.name = n 4 self.gender = g 5 self.age = a 6 7 def show(self): 8 print(self.name,self.gender,self.age) 9 10 p=Person('james','male',20) #p对象确定后,p对象的初始化(n,a,m)就完成了 11 p.show()
#python规定:类中只能有一个构造函数
#...__init__中设置默认参数
1 class Person: 2 def __init__(self,n='',g='male',a=0): 3 self.name = n 4 self.gender = g 5 self.age = a 6 7 def show(self): 8 print(self.name,self.gender,self.age) 9 10 a = Person('james') 11 b = Person('james','fenmale') 12 c = Person('james','male',20) 13 a.show() #结果:james male 0 14 b.show() #结果:james fenmale 0 15 c.show() #结果:james male 20 16 # __init__参数中如果设置了默认值,得到新的内容传参后则覆盖原值'''
#案例:日期类 MyDate
1 class MyDate: 2 __months = [0,31,28,31,30,31,30,31,31,30,31,30,31] 3 def __init__(self,y,m,d): 4 if (y<0): 5 print("Error:无效年份") 6 if (m<1 or m>12): 7 print("Error:无效月份") 8 if (y%400 == 0 or y%4 == 0 and y%100!=0): 9 MyDate.__months[2] = 29 10 else: 11 MyDate.__months[2] = 28 12 13 if d<1 or d>MyDate.__months[m]: 14 print("Error:无效日期") 15 #日期,月份,年份均合法后,创建类的属性(内容) 16 self.year = y 17 self.months = m 18 self.day = d 19 def show(self,end='\n'): 20 print("%d-%d-%d"%(self.year,self.months,self.day),end = end) 21 22 p = MyDate(2018,11,19) 23 p.show()
#类的继承
#派生与继承:Student:name gender age
1 class Person: 2 def __init__(self,name,gender,age): 3 self.name = name 4 self.gender = gender 5 self.age = age 6 7 def show(self,end='\n'): 8 print(self.name,self.gender,self.age) 9 10 class Student(Person): 11 def __init__(self,name,gender,age,major,dept): 12 Person.__init__(self,name,gender,age) 13 self.major = major 14 self.dept = dept 15 16 def show(self): 17 Person.show(self,'') 18 print(self.major,self.dept) 19 20 s = Student('james','male',20,'softwart','computer') 21 s.show() 22 23 24 ''' 25 结果: 26 james male 20 27 softwart computer 28 '''
#继承类构造函数:
从上面的Strdent类的定义可以看除派生类的构造函数除了要完成自己的新增加的
major,dept属性的初始化外,还要调用基类的Person的构造函数,而且还要显示调用
即: Person.__init__(self,neme,gender,age)
通过类名称Person直接调用Person的__init__函数,并提供所要的4个函数
继承类时不会自动调用基类的构造函数的,必须显示调用
#属性方法的继承:
如果一个基类中有一个实例方法,在继承类中也可以重新定义完全一样的实例方法。
例如 Person有show方法,在Student中也有一样的show方法,它们是不会混淆的
我们称Student类的show重写了Person的show
—当然,一个基类的实例方法也可以不被重写,派生类会继承这个基类的实例方法
-派生类也可以增加自己的新实例方法
1 class Person: 2 className = 'Person' #自己的实例属性 3 def __init__(self,name,gender,age): 4 self.name = name 5 self.gender = gender 6 self.age = age 7 8 def show(self,end='\n'): 9 print(self.name,self.gender,self.age) 10 11 @classmethod #类方法修饰 12 def classClassName(cls): 13 print(cls.className) 14 15 @staticmethod #静态方法修饰 16 def staticClassName(): 17 print(Person.className) 18 19 def display(self): 20 print('display') 21 22 class Student(Person): 23 #className = 'Student' 24 def __init__(self,name,gender,age,major,dept): 25 Person.__init__(self,name,gender,age) 26 self.major = major 27 self.dept = dept 28 29 def show(self): 30 Person.show(self,'') 31 print(self.major,self.dept) 32 33 s = Student('A','male',20,'software','computer') 34 s.show() 35 print(Student.className) #Student本身没有,则显示上一级(Person) 36 Student.classClassName() 37 Student.staticClassName() 38 39 s.display() #实例调用 40 41 42 #结果说明:Student继承了Person的实例、静态、类(属性)方法 43 #结果: 44 ''' 45 A male 20 46 software computer 47 Person 48 Person 49 Person 50 display 51 '''
#案例 :年月日 + 时分秒
1 class MyDate: 2 __months = [0,31,28,31,30,31,30,31,31,30,31,30,31] 3 def __init__(self,y,m,d): 4 if (y<0): 5 print("Error:无效年份") 6 if (m<1 or m>12): 7 print("Error:无效月份") 8 if (y%400 == 0 or y%4 == 0 and y%100!=0): 9 MyDate.__months[2] = 29 10 else: 11 MyDate.__months[2] = 28 12 13 if d<1 or d>MyDate.__months[m]: 14 print("Error:无效日期") 15 #日期,月份,年份均合法后,创建类的属性(内容) 16 self.year = y 17 self.months = m 18 self.day = d 19 def show(self,end='\n'): 20 print("%d-%d-%d"%(self.year,self.months,self.day),end = end) 21 22 class MyDateTime(MyDate): 23 def __init__(self,y,mo,d,h,mi,s): 24 MyDate.__init__(self,y,mo,d) 25 if (h<0 or h>23 or mi<0 or mi>59 or s<0 or s>59): 26 print("Error:无效时间") 27 self.hour = h 28 self.minute = mi 29 self.second = s 30 31 def show(self): 32 MyDate.show(self,'\t') 33 print("%d:%d:%d"%(self.hour,self.minute,self.second)) 34 35 36 p = MyDateTime(2018,11,19,21,21,54) 37 p.show() 38 39 #结果: 2018-11-19 21:21:54