博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python面向对象实例
阅读量:4658 次
发布时间:2019-06-09

本文共 8805 字,大约阅读时间需要 29 分钟。


 

——王宇阳 总结 (Code_boy201811月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中的nameage公有的
    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 = 2013 14 Person.name = 'B'15 Person.gender = 'Female'16 Person.age = 2117 18 print(p.name,p.gender,p.age)    #p实例对象属性19 print(Person.name,Person.gender,Person.age) #Person类属性

#实例方法
'''

1 class Person:2     age = 203     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.age10 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'值传递给s5 Person.show(p,'hello')  #hello 给 s'''

 

#类方法

1 class Person:2     age = 203     @classmethod4     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 = 203     @staticmethod4     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=n4         aelf.age=a5 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 014 b.show()    #结果:james fenmale 015 c.show()    #结果:james male 2016 # __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] = 2910         else:11             MyDate.__months[2] = 2812 13         if d<1 or d>MyDate.__months[m]:14             print("Error:无效日期")15         #日期,月份,年份均合法后,创建类的属性(内容)16         self.year = y17         self.months = m18         self.day = d19     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()

 

 

#类的继承

#派生与继承:Studentname 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 = major14         self.dept = dept15 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 2027 softwart computer28 '''

 

#继承类构造函数:
从上面的Strdent类的定义可以看除派生类的构造函数除了要完成自己的新增加的
major,dept属性的初始化外,还要调用基类的Person的构造函数,而且还要显示调用
    即: Person.__init__(self,neme,gender,age)
通过类名称Person直接调用Person__init__函数,并提供所要的4个函数
继承类时不会自动调用基类的构造函数的,必须显示调用

#属性方法的继承:
如果一个基类中有一个实例方法,在继承类中也可以重新定义完全一样的实例方法。
例如 Personshow方法,在Student中也有一样的show方法,它们是不会混淆的
我们称Student类的show重写了Personshow
—当然,一个基类的实例方法也可以不被重写,派生类会继承这个基类的实例方法
-派生类也可以增加自己的新实例方法

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 = major27         self.dept = dept28 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 2046 software computer47 Person48 Person49 Person50 display51 '''

 

#案例 :年月日 + 时分秒

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] = 2910         else:11             MyDate.__months[2] = 2812 13         if d<1 or d>MyDate.__months[m]:14             print("Error:无效日期")15         #日期,月份,年份均合法后,创建类的属性(内容)16         self.year = y17         self.months = m18         self.day = d19     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 = h28         self.minute = mi29         self.second = s30 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

 

 


 

转载于:https://www.cnblogs.com/wangyuyang1016/p/10035146.html

你可能感兴趣的文章
虚拟机报错:无法打开内核设备"\\.\Global\vmx86":
查看>>
Chapter 3 Phenomenon——8
查看>>
网络编程
查看>>
sublime text 按下Ctrl + B 显示空白的解决办法
查看>>
.net批量上傳Csv檔資料應用程序開發總結
查看>>
Java知识点总结
查看>>
C#中的String.Format()方法
查看>>
hdu 1000&hdu1001
查看>>
堆积木----vector防止内存超限
查看>>
MySQL 5.5 表分区功能增强
查看>>
more web
查看>>
VS2010 开发建立webservice服务并发布,使用VB6.0测试调用
查看>>
有限状态机FSM
查看>>
C# MemoryStream先写后读的奇怪现象
查看>>
自定义UITableViewCell详细步骤
查看>>
MySQL外键(foreign key)使用及说明详解
查看>>
Net记忆(转)
查看>>
ASP.NET MVC3关于生成纯静态后如何不再走路由直接访问静态页面
查看>>
图解 魔方快速还原 7步法
查看>>
SQL小技巧总结。
查看>>