经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Python3 » 查看文章
Python3.5面向对象与继承图文实例详解
来源:jb51  时间:2019/4/24 12:29:48  对本文有异议

本文实例讲述了Python3.5面向对象与继承。分享给大家供大家参考,具体如下:

1、编程的方式


2、面向对象的基本概念




3、类的基本概念




4、类的定义与调用——简单代码举例

注:建议类名的开头字母用大写,在Python中,类内的函数称作方法,类外的函数还是称作函数。





  1. #!/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3. # Author:ZhengzhengLiu
  4.  
  5. #类
  6. class Person:
  7. i = 10 #属性(变量)
  8. def eat(self): #方法(函数)
  9. print("eating...")
  10. pass
  11.  
  12. #类的调用
  13. a = Person()
  14. a.eat()

运行结果:

eating...

  1. class Person():
  2. #对象属性 构造方法 在实例化对象时会自动调用
  3. # 实例化的对象就具有name和age两个属性
  4. #self是指当前的对象 self不是关键字可以被代替,但是习惯使用self指代当前对象
  5. def __init__(self,name,age):
  6. # 通过构造方法声明了两个对象属性
  7. #对象.name属性 = name参数
  8. self.name = name
  9. self.age = age
  10.  
  11. #声明一个类方法
  12. def speak(self):
  13. print("Hello,my name is %s,and I'm %d years old" %(self.name,self.age))
  14.  
  15. #创建实例对象 会触发构造方法
  16. people01 = Person("Jack",18) #通过Person类实例化出一个people对象
  17. print(people01) #打印Person对象在内存中的地址
  18.  
  19. print(people01.name,people01.age) #打印对象的属性
  20.  
  21. #给对象添加属性
  22. people01.sex = "F"
  23. print(people01.sex)
  24.  
  25. #类方法的调用
  26. people01.speak()

运行结果:

<__main__.Person object at 0x0059C5B0>
Jack 18
F
Hello,my name is Jack,and I'm 18 years old

5、类的方法



示例代码:

  1. #方法——静态方法
  2. class S():
  3. #实例(对象)属性
  4. def __init__(self,name,age): #self一般指实例对象
  5. self.name = name
  6. self.age = age
  7.  
  8. @staticmethod #用staticmethod装饰器修饰 表示test2为静态方法
  9. def test2(): #不能传入self 对象的引用
  10. print("test2...")
  11.  
  12. s1 = S("Joe",18)
  13. s1.test2() #通过实例调用静态方法
  14. S.test2() #通过类名调用静态方法
  15.  
  16.  
  17. #方法——类方法
  18. class C():
  19. #类属性
  20. country = "China"
  21.  
  22. #实例(对象)属性
  23. def __init__(self,name,age):
  24. self.name = name
  25. self.age = age
  26.  
  27. @classmethod #用classmethod装饰器修饰 表示test3为类方法
  28. def test3(cls): #cls指的是类
  29. print("test3...",cls.country) #类方法调用类属性
  30.  
  31.  
  32. c1 = C("Jack",18)
  33. c1.test3() #通过实例调用类方法
  34. C.test3() #通过类名调用类方法

运行结果:

test1...
test2...
test2...
test3... China
test3... China


(1)构造方法:构造方法不能重载(被覆盖)

在Python中内置,每一个类都有一个默认的不带参数的构造方法,不需要人为的单独调用,在调用类的同时就运行了构造方法。

构造方法的作用:初始化数据、创建对象(构造方法的调用)


  1. #!/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3. # Author:ZhengzhengLiu
  4.  
  5. class Person:
  6. def __init__(self):
  7. print("构造方法")
  8. pass
  9.  
  10. Person() #类的调用--创建对象

运行结果

构造方法

带参数的构造方法:

  1. #!/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3. # Author:ZhengzhengLiu
  4.  
  5. class Person:
  6. # def __init__(self):
  7. # print("构造方法")
  8. def __init__(self,x):
  9. print("带参数的构造方法:",x)
  10.  
  11. def add(self,x,y):
  12. print(x+y)
  13.  
  14. pass
  15.  
  16. zs = Person("hello") #类的调用--创建对象
  17. zs.add(1,2)

 运行结果:

带参数的构造方法: hello
3

(2)面向对象的思路

(3)类方法

  1. #!/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3. # Author:ZhengzhengLiu
  4.  
  5. #类方法
  6. class Person:
  7. def eat(self): #类方法
  8. print("eating...")
  9. pass
  10.  
  11. a = Person() #类方法调用
  12. a.eat()
  13.  

运行结果:

eating...

(4)私有方法

只允许在类的内部使用,专门为类服务的。

  1. #!/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3. # Author:ZhengzhengLiu
  4.  
  5. class Person:
  6. def eat(self): # 类方法
  7. print("eating...")
  8. self.__sleep() # 调用私有方法
  9.  
  10. def __sleep(self): #私有方法--类的外部不能使用
  11. print("sleeping...")
  12.  
  13. pass
  14.  
  15. b = Person()
  16. b.eat()

运行结果:

eating...
sleeping...

6、属性




示例属性、类属性代码:

  1. #!/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3. # Author:ZhengzhengLiu
  4.  
  5. #属性
  6.  
  7. class a():
  8. def __init__(self,name,age):
  9. self.name = name #实例属性
  10. self.age = age
  11.  
  12. #类内部使用实例属性 self.实例属性名
  13. def get(self):
  14. print(self.name)
  15.  
  16. a1 = a("Jack",18)
  17.  
  18. #类内部使用实例属性 self.实例属性名
  19. a1.get()
  20.  
  21. #类外部使用实例属性 对象名.实例属性名
  22. print(a1.name)
  23.  
  24. #类属性 在__init__()方法外声明
  25. #类内部使用 类名.属性名 调用
  26. #类外部使用通过 类名.属性名 或者 对象名.属性名 方式调用
  27.  
  28. class b():
  29. name = "Janne" #类属性
  30.  
  31. #类内部使用类属性——类名.属性名
  32. def get(self):
  33. print(b.name)
  34.  
  35. #类外部使用类属性 通过 类名.属性名
  36. print(b.name)
  37.  
  38. #类外部使用类属性 通过 对象名.属性名
  39. b1 = b()
  40. print(b1.name)
  41.  
  42. #类内部使用类属性——类名.属性名
  43. b1.get()

运行结果:

Jack
Jack
Janne
Janne
Janne

(1)类属性/类变量:在类的外部可以调用

(2)私有变量/私有属性:只能在类的内部,通过self使用

  1. #!/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3. # Author:ZhengzhengLiu
  4.  
  5. #属性/变量
  6. class Person:
  7. i = 10 #类属性/类变量
  8. __j = 20 #私有属性/私有变量
  9.  
  10. def eat(self): # 类方法
  11. print("eating...")
  12. print(self.__j) # 调用私有变量
  13.  
  14. pass
  15.  
  16. b = Person()
  17. print(b.i) #通过引用调用(建议)
  18. print(Person.i) #可通过类名调用
  19. b.eat()

运行结果:

10
10
eating...
20


  1. class GirlFriend():
  2. #声明对象属性 通过构造方法
  3. def __init__(self,name,age,phone,pwd):
  4. #给对象的属性(变量名)前面加上 __ 成为了私有的属性
  5. self.__name = name
  6. self.__age = age
  7. self.__phone = phone
  8. self.__pwd = pwd
  9.  
  10. #通过预留的接口 对私有属性名进行访问或修改
  11. def getInfo(self,pwd):
  12. if pwd == "1234":
  13. print("My girlfriend is %s,and she's %d years old,Her telephone number is %d"%(self.__name,self.__age,self.__phone))
  14. else:
  15. print("you failed...")
  16.  
  17. def setName(self,name):
  18. self.__name = name #类内修改私有属性
  19.  
  20. gf = GirlFriend("Janne",18,13511112222,"1234")
  21. gf.setName("Malianna")
  22. gf.getInfo("1234")
  23.  

运行结果:

My girlfriend is Malianna,and she's 18 years old,Her telephone number is 13511112222


(3)特殊的类属性


7、继承

Python中支持多继承,作用:复用,不建议使用多继承(类对象爆炸)、


继承示例代码:

  1. #继承
  2. #父类
  3. class Animal():
  4. def __init__(self,name,food,drinks):
  5. self.name = name
  6. self.food = food
  7. self.drinks = drinks
  8.  
  9. def eat(self):
  10. print("%s 爱吃 %s" %(self.name,self.food))
  11.  
  12. def drink(self):
  13. print("%s 爱喝 %s" %(self.name,self.drinks))
  14.  
  15.  
  16. #子类
  17. class Dog(Animal):
  18.  
  19. def sound(self):
  20. print("wonf wonf...")
  21.  
  22. class Cat(Animal):
  23.  
  24. def sound(self):
  25. print("miao miao...")
  26.  
  27. dogs = Dog("哮天犬","骨头","雪碧")
  28. dogs.eat()
  29. dogs.drink()
  30. dogs.sound()
  31.  
  32. print("========================")
  33. cats = Cat("波斯猫","鱼","可乐")
  34. cats.eat()
  35. cats.drink()
  36. cats.sound()
  37.  

运行结果:

哮天犬 爱吃 骨头
哮天犬 爱喝 雪碧
wonf wonf...
========================
波斯猫 爱吃 鱼
波斯猫 爱喝 可乐
miao miao...

示例一:

多继承


  1. #!/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3. # Author:ZhengzhengLiu
  4.  
  5. #多继承
  6.  
  7. class Run3000:
  8. def run(self):
  9. print("run 3000")
  10.  
  11. class Jump3:
  12. def jump(self):
  13. print("jump 3")
  14.  
  15. class Sport(Run3000,Jump3): #继承
  16. pass
  17.  
  18. sport = Sport()
  19. sport.run()
  20. sport.jump()
  21.  

运行结果:

run 3000
jump 3

示例二:

  1. #!/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3. # Author:ZhengzhengLiu
  4.  
  5. class Father:
  6. def __init__(self):
  7. print("father 构造")
  8. def teach(self):
  9. print("father teaching")
  10.  
  11. class Child(Father):
  12. pass
  13.  
  14. zs = Child() #子类继承与父类,创建子类前先创建父类
  15. zs.teach()
  16.  

运行结果:

father 构造
father teaching

子类中重写父类的方法:重写体现多态


  1. #!/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3. # Author:ZhengzhengLiu
  4.  
  5. class Father:
  6. def __init__(self):
  7. print("father 构造")
  8. def teach(self):
  9. print("father teaching")
  10.  
  11. class Child(Father):
  12. def teach(self): #方法重写
  13. print("child teaching")
  14.  
  15. zs = Child() #子类继承与父类,创建子类前先创建父类
  16. zs.teach()
  17.  

运行结果:

father 构造
child teaching

新式类:

如果父类的构造方法带参数,则需要子类通过super操作去完成调用。


  1. #!/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3. # Author:ZhengzhengLiu
  4.  
  5. #新式类
  6. class Father(object):
  7. def __init__(self,i):
  8. print("father 构造"+ i)
  9. def teach(self):
  10. print("father teaching")
  11.  
  12. class Child(Father):
  13. def __init__(self):
  14. super(Child,self).__init__("hello")
  15. def teach(self): #方法重写
  16. print("child teaching")
  17.  
  18. zs = Child() #子类继承与父类,创建子类前先创建父类
  19. zs.teach()
  20.  
  21. #运行结果:
  22. father 构造hello
  23. child teaching

运行结果:

father 构造hello
child teaching

多继承又不完全,父类都有构造方法时,当子类多继承时,只有一个父类的构造方法被调用。

  1. #!/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3. # Author:ZhengzhengLiu
  4.  
  5. class Run3000:
  6. def __init__(self):
  7. print("run 3000 构造方法")
  8. def run(self):
  9. print("run 3000")
  10.  
  11. class Jump3:
  12. def __init__(self):
  13. print("jump 3 构造方法")
  14. def jump(self):
  15. print("jump 3")
  16.  
  17. class Sport(Run3000,Jump3): #继承
  18. pass
  19.  
  20. sport = Sport()
  21. sport.run()
  22. sport.jump()

运行结果:

run 3000 构造方法
run 3000
jump 3

8、面向对象编程

(1)定义

(2)示例代码——人开车



更多关于Python相关内容感兴趣的读者可查看jb51专题:《Python面向对象程序设计入门与进阶教程》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python编码操作技巧总结》及《Python入门与进阶经典教程

希望本文所述对大家Python程序设计有所帮助。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号