python_面向对象—代码练习

"""注意:代码切勿照搬,错误请留言指出"""

  1 import re
  2 
  3 '''
  4 class Person:
  5     name='xxx'
  6     age=20
  7 
  8 p=Person()  #p为实例对象
  9 print(p.name,p.age)
 10 p.name="yyy"
 11 p.gender='male'
 12 print(p.name,p.gender,p.age)
 13 print(Person.name,Person.age)
 14 #p(实例对象)对值得修改不影响Person类中的内容
 15 Person.age='30'
 16 print(Person.age)
 17 #class Person (类) 对值得修改将该影响Person类中的内容
 18 '''
 19 
 20 #访问权限(类的属性)
 21 '''
 22 class Person:   #Person中的name和age公有的
 23     name = 'james'
 24     age=20
 25 #在python中规定在前面加两个下划线,就变为私有的
 26 '''
 27 '''
 28 class Person:
 29     __name = 'james'        #私有的__name
 30     age = 20
 31 
 32     def show(self):     #self >> 自己
 33         print(self.__name,self.age)     #自己访问自己 正常返回
 34 
 35 
 36 
 37 p=Person ()
 38 p.show()      #需要调用除show()函数,否则会拒绝class中的show的执行
 39 print(Person.__name)            # 访问类中的私有属性 异常返回
 40 print(p.age)
 41 #出现私有的函数调用时,结果同样如此!私有的函数,元素只能在class中被使用
 42 #常用的方法就是通过调用公有的函数来执行函数内的私有属性的调用
 43 '''
 44 
 45 #案例:编写个人信息并建立对象访问属性
 46 '''
 47 class Person:
 48     name = 'xxx'
 49     gender = 'x'
 50     age = 0
 51 
 52 p=Person()
 53 print(p.name,p.gender,p.age)
 54 print(Person.name,Person.gender,Person.age)
 55 
 56 p.name = 'A'
 57 p.gender = 'Male'
 58 p.age = 20
 59 
 60 Person.name = 'B'
 61 Person.gender = 'Female'
 62 Person.age = 21
 63 
 64 print(p.name,p.gender,p.age)    #p实例对象属性
 65 print(Person.name,Person.gender,Person.age) #Person类属性
 66 '''
 67 
 68 #实例方法
 69 '''
 70 class Person:
 71     age = 20
 72     def show(self):
 73         print (self.age)
 74 
 75 p.Person()
 76 #实例方法至少有一个参数,一般以名为(self)的变量作为该参数(名称可自定义)
 77 #实例方法通过实例对象调用,例如:p.show()
 78 #如果使用类名称调用,需要人为传递实例参数,例如:Person.show(p)
 79 #实例方法被调用是要向他的第一个参数传递实例对象
 80 '''
 81 '''
 82 class Person:
 83     name = 'james'
 84     age = 12
 85 
 86     def getName(self):
 87         return self.name
 88 
 89     def getAge(self):
 90         return self.age
 91 
 92 p=Person()
 93 print(p.getName(),p.getAge())   #实例属性对象调用
 94 print(Person.getAge(p)) #类名称调用
 95 '''
 96 '''
 97     def show(self,s):   #参数传递
 98         print(self,s)
 99 
100 p.show('hi')    #'hi'值传递给s
101 Person.show(p,'hello')  #hello 给 s'''
102 
103 #类方法
104 '''
105 class Person:
106     age = 20
107     @classmethod
108     def show(cls):
109         print(cls.age)
110 
111 p=Person()
112 '''
113 #类方法要使用 @classmethod 来修饰,而且第一个参数一般命名为cls(可另定名)
114 #类方法通常使用类的名称调用,例如:Person.show()
115 #类方法也可实例方法调用,例如:p.show()
116 #类方法调用时会向它的第一个参数传递类的名称
117 '''
118 class Person:
119     __name = 'james'
120     __age = 12
121 
122     @classmethod
123     def show(self):
124         print(self)
125         print(self.__name,self.__age)
126 
127 Person.show()
128 p=Person()
129 p.show()'''
130 
131 #静态方法
132 '''
133 定义:
134 class Person:
135     age = 20
136     @staticmethod
137     def show():
138         print(Person.age)
139 
140 p = Person()
141 
142 #静态变量函数通过@staticmethod修饰
143 #通常采用类的名称或者实例来调用静态方法,例如:Person.show(),p.show()
144 #在调用静态函数时不会向函数传递任何参数
145 '''
146 '''
147 class Person:
148     __name = 'james'
149     __age = 12
150 
151     @staticmethod
152     def show():     #静态不带参数
153         print(Person.__name)
154 
155 p = Person()
156 Person.show()
157 p.show()
158 '''
159 
160 #类、实例、静态方法 不同——Person
161 '''
162 class Person:
163     name = 'xxx'
164     gender = 'x'
165     age = 0
166                     #实例方法
167     def instanceShow(self):
168         print(self.name,self.gender,self.age)
169 
170     @classmethod    #类方法
171     def classShow(cls):
172         print(cls.name,cls.gender,cls.age)
173 
174     @staticmethod   #静态方法
175     def staticShow():
176         print(Person.name,Person.gender,Person.age)
177 
178 
179 p=Person()
180 p.instanceShow()        #实例方法调用
181 Person.classShow()      #类方法调用
182 Person.staticShow()     #静态方法调用
183 '''
184 '''
185 实例方法一般用实例对象调用
186 类方法和静态方法一般用类名称调用
187 '''
188 
189 #对象初始化
190 '''
191 构造方法(函数)...>完成函数初始化
192 @ 构造方法__init__(self, ... )在生成对象时调用,
193 可以用来进行一些初始化操作,不需要显示去调用,系统默认执行
194 如果用户自己没有定义构造方法,系统就自己执行默认的额构造方法
195 
196 class Person:
197     def __init__(self,n,a):
198         self.name=n
199         aelf.age=a
200 
201 p=Person('xxx',20)
202 print(p.name,p.age)
203 
204 @ 析构方法__del__(self)在释放对象时调用,可以在里面进行一些释放资源的操作
205 不需要显示调用
206 
207 class Person:
208     def __init__(self,n,a):
209         self.name = n
210         self.age = a
211     def __del__(self):
212         print('__del__',self.name,self.age)
213         
214 p=Person('xxx',20)
215 print(p.name,p.age)
216 ''''''
217 class Person:
218     def __init__(self):
219         print("__init__",self)
220     def __del__(self):
221         print("__del__",self)
222 
223 p=Person()'''
224 
225 #__init__完成对象初始化
226 '''
227 class Person:
228     def __init__(self,n,g,a):       #n,g,a 传参单位
229         self.name = n
230         self.gender = g
231         self.age = a
232 
233     def show(self):
234         print(self.name,self.gender,self.age)
235 
236 p=Person('james','male',20)     #p对象确定后,p对象的初始化(n,a,m)就完成了
237 p.show()
238 '''
239 #python规定:类中只能有一个构造函数
240 #...__init__中设置默认参数
241 '''
242 class Person:
243     def __init__(self,n='',g='male',a=0):
244         self.name = n
245         self.gender = g
246         self.age = a
247 
248     def show(self):
249         print(self.name,self.gender,self.age)
250 
251 a = Person('james')
252 b = Person('james','fenmale')
253 c = Person('james','male',20)
254 a.show()    #结果:james male 0
255 b.show()    #结果:james fenmale 0
256 c.show()    #结果:james male 20
257 # __init__参数中如果设置了默认值,得到新的内容传参后则覆盖原值'''
258 
259 #案例:日期类 MyDate
260 '''
261 class MyDate:
262     __months = [0,31,28,31,30,31,30,31,31,30,31,30,31]
263     def __init__(self,y,m,d):
264         if (y<0):
265             print("Error:无效年份")
266         if (m<1 or m>12):
267             print("Error:无效月份")
268         if (y%400 == 0 or y%4 == 0 and y%100!=0):
269             MyDate.__months[2] = 29
270         else:
271             MyDate.__months[2] = 28
272 
273         if d<1 or d>MyDate.__months[m]:
274             print("Error:无效日期")
275         #日期,月份,年份均合法后,创建类的属性(内容)
276         self.year = y
277         self.months = m
278         self.day = d
279     def show(self,end='\n'):
280         print("%d-%d-%d"%(self.year,self.months,self.day),end = end)
281 
282 p = MyDate(2018,11,19)
283 p.show()
284 '''
285 
286 #类的继承
287 #派生与继承:Student:name gender age
288 '''
289 class Person:
290     def __init__(self,name,gender,age):
291         self.name = name
292         self.gender = gender
293         self.age = age
294 
295     def show(self,end='\n'):
296         print(self.name,self.gender,self.age)
297 
298 class Student(Person):
299     def __init__(self,name,gender,age,major,dept):
300         Person.__init__(self,name,gender,age)
301         self.major = major
302         self.dept = dept
303 
304     def show(self):
305         Person.show(self,'')
306         print(self.major,self.dept)
307 
308 s = Student('james','male',20,'softwart','computer')
309 s.show()
310 '''
311 '''
312 结果:
313 james male 20
314 softwart computer
315 '''
316 #继承类构造函数:
317 '''
318 从上面的Strdent类的定义可以看除派生类的构造函数除了要完成自己的新增加的
319 major,dept属性的初始化外,还要调用基类的Person的构造函数,而且还要显示调用
320     即: Person.__init__(self,neme,gender,age)
321 通过类名称Person直接调用Person的__init__函数,并提供所要的4个函数
322 继承类时不会自动调用基类的构造函数的,必须显示调用
323 '''
324 
325 #属性方法的继承:
326 '''
327 如果一个基类中有一个实例方法,在继承类中也可以重新定义完全一样的实例方法。
328 例如 Person有show方法,在Student中也有一样的show方法,它们是不会混淆的
329 我们称Student类的show重写了Person的show
330 —当然,一个基类的实例方法也可以不被重写,派生类会继承这个基类的实例方法
331 -派生类也可以增加自己的新实例方法
332 '''
333 '''
334 class Person:
335     className = 'Person'    #自己的实例属性
336     def __init__(self,name,gender,age):
337         self.name = name
338         self.gender = gender
339         self.age = age
340 
341     def show(self,end='\n'):
342         print(self.name,self.gender,self.age)
343 
344     @classmethod        #类方法修饰
345     def classClassName(cls):
346         print(cls.className)
347 
348     @staticmethod       #静态方法修饰
349     def staticClassName():
350         print(Person.className)
351 
352     def display(self):
353         print('display')
354 
355 class Student(Person):
356     #className = 'Student'
357     def __init__(self,name,gender,age,major,dept):
358         Person.__init__(self,name,gender,age)
359         self.major = major
360         self.dept = dept
361 
362     def show(self):
363         Person.show(self,'')
364         print(self.major,self.dept)
365 
366 s = Student('A','male',20,'software','computer')
367 s.show()
368 print(Student.className)    #Student本身没有,则显示上一级(Person)
369 Student.classClassName()
370 Student.staticClassName()
371 
372 s.display() #实例调用
373 '''
374 #结果说明:Student继承了Person的实例、静态、类(属性)方法
375 #结果:
376 '''
377 A male 20
378 software computer
379 Person
380 Person
381 Person
382 display
383 '''
384 
385 #案例 :年月日 + 时分秒
386 
387 class MyDate:
388     __months = [0,31,28,31,30,31,30,31,31,30,31,30,31]
389     def __init__(self,y,m,d):
390         if (y<0):
391             print("Error:无效年份")
392         if (m<1 or m>12):
393             print("Error:无效月份")
394         if (y%400 == 0 or y%4 == 0 and y%100!=0):
395             MyDate.__months[2] = 29
396         else:
397             MyDate.__months[2] = 28
398 
399         if d<1 or d>MyDate.__months[m]:
400             print("Error:无效日期")
401         #日期,月份,年份均合法后,创建类的属性(内容)
402         self.year = y
403         self.months = m
404         self.day = d
405     def show(self,end='\n'):
406         print("%d-%d-%d"%(self.year,self.months,self.day),end = end)
407 
408 class MyDateTime(MyDate):
409     def __init__(self,y,mo,d,h,mi,s):
410         MyDate.__init__(self,y,mo,d)
411         if (h<0  or  h>23  or  mi<0  or  mi>59  or  s<0  or  s>59):
412             print("Error:无效时间")
413         self.hour = h
414         self.minute = mi
415         self.second = s
416 
417     def show(self):
418         MyDate.show(self,'\t')
419         print("%d:%d:%d"%(self.hour,self.minute,self.second))
420 
421 
422 
423 
424 p = MyDateTime(2018,11,19,21,21,54)
425 p.show()
426 
427 #结果:    2018-11-19  21:21:54

 

posted @ 2018-11-28 22:11  Mirror王宇阳  阅读(370)  评论(0编辑  收藏  举报