基本概念

Class 类
一个类即是对一类拥有相同属性的对象的抽象、蓝图、原型。在类中定义了这些对象的都具备的属性(variables(data))、共同的方法

Object 对象
一个对象即是一个类的实例化后实例,一个类必须经过实例化后方可在程序中调用,一个类可以实例化多个对象,每个对象亦可以有不同的属性,就像人类是指所有人,每个人是指具体的对象,人与人之前有共性,亦有不同

Encapsulation 封装
在类中对数据的赋值、内部调用对外部用户是透明的,这使类变成了一个胶囊或容器,里面包含着类的数据和方法

Inheritance 继承
一个类可以派生出子类,在这个父类里定义的属性、方法自动被子类继承

Polymorphism 多态

一个接口,多种实现

类的创建

  1. class Car(object):
  2.  
  3. def __init__(self,type,price):
  4. self.type = type
  5. self.price = price
  6.  
  7. def carinfo(self):
  8. print("type:%s,price:%d"%(self.type,self.price))
  9.  
  10. tesla = Car('tesla',2000)
  11. jeep = Car('jeep',1000)
  12.  
  13. tesla.carinfo()
  14. jeep.carinfo()

对象之间的交互

  1. class Garen:
  2. camp = 'Demacia'
  3.  
  4. def __init__(self,name,aggressivity = 58,life_value = 455): #初始攻击力和生命值
  5. self.name = name
  6. self.aggressivity = aggressivity
  7. self.life_value = life_value
  8.  
  9. def attack(self,enemy): #普通攻击技能,攻击敌人
  10. enemy.life_value -= self.aggressivity #根据攻击力,减掉敌人生命值
  11.  
  12. class Riven:
  13. camp = 'Noxus'
  14.  
  15. def __init__(self,name,aggressivity = 54,life_value = 4514):
  16. self.name = name
  17. self.aggressivity = aggressivity
  18. self.life_value = life_value
  19.  
  20. def attack(self,enemy):
  21. enemy.life_value -= self.aggressivity
  22.  
  23. g1 = Garen('盖伦')
  24. r1 = Riven("瑞文")
  25.  
  26. print(g1.life_value)
  27. r1.attack(g1) #交互
  28. print(g1.life_value

继承

继承指的是类与类之间的关系,是一种什么是什么的关系,功能之一就是用来解决代码重用问题

继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类

  1. class People(object):
  2. def __init__(self,name,age):
  3. self.name = name
  4. self.age = age
  5. def eat(self):
  6. print("%s is eating..." % self.name)
  7. def talk(self):
  8. print("%s is talking..." % self.name)
  9. def sleep(self):
  10. print("%s is sleeping..." % self.name)
  11.  
  12. class Man(People):
  13. def __init__(self,name,age,money):
  14. super(Man,self).__init__(name,age)
  15. self.money = money
  16. print("%s 一出生就有%s money" %(self.name,self.money))
  17. def sleep(self):
  18. print("man is sleeping ")
  19.  
  20. class Woman(People):
  21. def get_birth(self):
  22. print("%s is born a baby...." % self.name)
  23.  
  24. m1 = Man("jack",22,10000)
  25. m1.sleep()
  26. w1 = Woman("alex",26)
  27. w1.get_birth()

组合

组合与继承都是有效地利用已有类的资源的重要方式。但是二者的概念和使用场景皆不同,

1.继承的方式

通过继承建立了派生类与基类之间的关系,它是一种'是'的关系,比如白马是马,人是动物。

当类之间有很多相同的功能,提取这些共同的功能做成基类,用继承比较好,比如老师是人,学生是人

2.组合的方式

用组合的方式建立了类与组合的类之间的关系,它是一种‘有’的关系,比如教授有生日,教授教python和linux课程,教授有学生s1、s2、s3...

  1. class Equip():
  2. def file(self):
  3. print('release fire skill')
  4.  
  5. class Riven():
  6. camp = 'Noxus'
  7. def __init__(self,name):
  8. self.name = name
  9. self.equip = Equip() #用Equip类产生一个装备,赋值给实例的equip属性
  10.  
  11. r1 = Riven('瑞文')
  12. r1.equip.file() #可以使用组合的类产生的对象所持有的方法
  13.  
  14. 结果:
  15. release fire skill

继承与组合例子:

  1. class People(object):
  2. def __init__(self,name,age,sex):
  3. self.name = name
  4. self.age = age
  5. self.sex = sex
  6.  
  7. class Course(object):
  8. def __init__(self,name,period,price):
  9. self.name = name
  10. self.period = period
  11. self.price = price
  12. def tell_info(self):
  13. print('%s %s %s'%(self.name,self.period,self.price))
  14.  
  15. class Teacher(People):
  16. def __init__(self,name,age,sex,job):
  17. super(Teacher, self).__init__(name,age,sex)
  18. self.job = job
  19. self.course = []
  20. self.students = []
  21.  
  22. class Student(People):
  23. def __init__(self,name,age,sex):
  24. super(Student, self).__init__(name,age,sex)
  25. self.course = []
  26.  
  27. #老师和学生对象
  28. jack = Teacher('jack',18,'male','c++')
  29. s1 = Student('derek',12,'female')
  30. #课程
  31. python = Course('python','3mons',3000)
  32. linux = Course('linux','4mons',5000)
  33. #为老师和学生添加课程
  34. jack.course.append(python)
  35. jack.course.append(linux)
  36. s1.course.append(linux)
  37. #为老师添加学生
  38. jack.students.append(s1)
  39. #使用
  40. for obj in jack.course:
  41. obj.tell_info()

3.私有属性

方法

1.静态方法  (@staticmethod)

静态方法是不可以访问实例变量或类变量的,一个不能访问实例变量和类变量的方法,其实相当于跟类本身已经没什么关系了

  1. class Dog(object):
  2.  
  3. def __init__(self,name):
  4. self.name = name
  5. @staticmethod
  6. def eat():
  7. print('is eating')
  8.  
  9. d = Dog('xiaohei')
  10. d.eat()

2.类方法(@classmethod)

  1. class Dog(object):
  2.  
  3. def __init__(self,name):
  4. self.name = name
  5. @classmethod
  6. def eat(cls):
  7. print('is eating')
  8.  
  9. d = Dog('xiaohei')
  10. d.eat()

3.属性方法(@property)

  1. class Dog(object):
  2.  
  3. def __init__(self,name):
  4. self.name = name
  5. @property
  6. def eat(self):
  7. print('is eating')
  8.  
  9. d = Dog('xiaohei')
  10. d.eat

把一个方法变成一个静态属性,因为eat此时已经变成一个静态属性了, 不是方法了, 想调用已经不需要加()号了,直接d.eat就可以了

多态

所谓多态:定义时的类型和运行时的类型不一样,此时就成为多态

  1. class F1(object):
  2. def show(self):
  3. print 'F1.show'
  4.  
  5. class S1(F1):
  6.  
  7. def show(self):
  8. print 'S1.show'
  9.  
  10. class S2(F1):
  11.  
  12. def show(self):
  13. print 'S2.show'
  14.  
  15. def Func(obj):
  16. print obj.show()
  17.  
  18. s1_obj = S1()
  19. Func(s1_obj) # 在Func函数中传入S1类的对象 s1_obj,执行 S1 的show方法,结果:S1.show
  20.  
  21. s2_obj = S2()
  22. Func(s2_obj) # 在Func函数中传入Ss类的对象 ss_obj,执行 Ss 的show方法,结果:S2.show

类的特殊方法

1.__doc__

表示类的描述信息

  1. class Func():
  2. """ 这里显示的是描述信息 """
  3.  
  4. def func(self):
  5. pass
  6. print(Func.__doc__)
  7.  
  8. 结果:
  9. 这里显示的是描述信息

2.__str__

如果一个类中定义了__str__方法,那么在打印 对象 时,默认输出该方法的返回值。

  1. class Foo:
  2. def __str__(self):
  3. return 'alex li'
  4. obj = Foo()
  5. print(obj)
  6.  
  7. 结果:
  8. alex li

3.反射

hasattr:判断一个对象是否有对应字符串方法

getattr:获取方法

setattr:添加方法

delattr:删除方法

  1. def bulk(self): #添加的方法
  2. print("%s is yelling...." %self.name)
  3.  
  4. class Dog(object):
  5. def __init__(self,name):
  6. self.name = name
  7.  
  8. def eat(self,food):
  9. print("%s is eating..."%self.name,food)
  10.  
  11. d = Dog("NiuHanYang")
  12. choice = input(">>:").strip()
  13.  
  14. if hasattr(d,choice): #输入的字符串,判断是否有对应字符串的方法
  15. func1 = getattr(d,choice)
  16. func1('')
  17. else:
  18. setattr(d,choice,bulk) #d.talk = bulk #通过setattr在类外部添加方法
  19. func2 = getattr(d, choice)
  20. func2(d)
  21.  
  22. # if hasattr(d.choice): #删除
  23. # delattr(d.choice)

4.__del__

创建对象后,python解释器默认调用__init__()方法;

当删除一个对象时,python解释器也会默认调用一个方法,这个方法为__del__()方法

8.python面向对象编程的更多相关文章

  1. python 面向对象编程学习

    1. 问题:将所有代码放入一个py文件:无法维护 方案:如果将代码才分放到多个py文件,好处: 1. 同一个名字的变量互相不影响 2.易于维护 3.引用模块: import module 2.包:解决 ...

  2. python 面向对象编程(一)

    一.如何定义一个类 在进行python面向对象编程之前,先来了解几个术语:类,类对象,实例对象,属性,函数和方法. 类是对现实世界中一些事物的封装,定义一个类可以采用下面的方式来定义: class c ...

  3. Python面向对象编程指南

    Python面向对象编程指南(高清版)PDF 百度网盘 链接:https://pan.baidu.com/s/1SbD4gum4yGcUruH9icTPCQ 提取码:fzk5 复制这段内容后打开百度网 ...

  4. python面向对象编程进阶

    python面向对象编程进阶 一.isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 1 ...

  5. Python面向对象编程(下)

    本文主要通过几个实例介绍Python面向对象编程中的封装.继承.多态三大特性. 封装性 我们还是继续来看下上文中的例子,使用Student类创建一个对象,并修改对象的属性.代码如下: #-*- cod ...

  6. Python 面向对象编程——访问限制

    <无访问限制的对象> 在Class内部,可以有属性和方法,而外部代码可以通过直接调用实例变量的方法来操作数据,这样,就隐藏了内部的复杂逻辑.但是,从前面Student类的定义来看(见:Py ...

  7. Python 面向对象编程 继承 和多态

    Python 面向对象编程 继承 和多态 一:多继承性 对于java我们熟悉的是一个类只能继承一个父类:但是对于C++ 一个子类可以有多个父亲,同样对于 Python一个类也可以有多个父亲 格式: c ...

  8. Python 面向对象编程基础

    Python 面向对象编程基础 虽然Pthon是解释性语言,但是Pthon可以进行面向对象开发,小到 脚本程序,大到3D游戏,Python都可以做到. 一类: 语法: class 类名: 类属性,方法 ...

  9. python面向对象编程学习

    python面向对象编程 基本概念理解 面向对象编程--Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作 ...

  10. Python面向对象编程——继承与派生

    Python面向对象编程--继承与派生 一.初始继承 1.什么是继承 继承指的是类与类之间的关系,是一种什么"是"什么的关系,继承的功能之一就是用来解决代码重用问题. 继承是一种创 ...

随机推荐

  1. apache ab 结果Failed requests探究

    Failed requests: 537 (Connect: 0, Receive: 3, Length: 268, Exceptions: 266) Receive:当客户端connect成功后,并 ...

  2. sql server 临时库文件太大 迁移tempdb数据库

    由于装SQL Server时默认装在系统盘,使用一段时间后,tempdb数据库占了68G,导致整个C盘爆满,彻底解决办法就是迁移tempdb物理文件,移至其他大空间磁盘上. 将 tempdb 从其在磁 ...

  3. php-fpm 配置中pm的选择

    另附豆瓣技术贴:https://www.douban.com/note/315222037/ 1.php-fpm优化参数介绍他们分别是:pm.pm.max_children.pm.start_serv ...

  4. LOJ-10091(强连通分量)

    题目链接:传送门 思路: 多少头牛收到所有牛头牛的喜欢,喜欢具有传递性,所以将互相喜欢的牛视为一个点,就是有向图的 缩点,收到所有牛的喜欢要求这个“点”没有出度,所以缩点之后统计所有没有出度的点就是结 ...

  5. s6-3 通信模型

    传输层的作用范围 通信5元组 一些已分配的知名端口 三元组 协议. 本地端点. 远方端点 五元组 协议. 本地IP地址.本地端口号. 远端IP地址.远端端口号 通信5元组 源IP 源端口 目的I ...

  6. js浮点数加减乘除精度不准确

    做个记录,以备不时之需 //加法 Number.prototype.add = function(arg){ var r1,r2,m; try{r1=this.toString().split(&qu ...

  7. 探寻TP-Link路由器的登录验证

    提示:该案例仅供学习使用,切勿滥用!!! 查找路由器连接地址 查找ip $ ifconfig enp2s0: flags=<UP,BROADCAST,RUNNING,MULTICAST> ...

  8. centos 安装部署zabbix

    Zabbix_server初始安装部署 各模块要安装的模块 Server:server+nginx+mysql+php Agentd:agentd Proxy:proxy+mysql 1.准备环境: ...

  9. JSP与Servlet的关系

    之前的文章里有说过,其实Servlet比JSP出现的早,JSP的本质就是Servlet,但是一个是jsp页面,一个是java类,硬要说他们的本质是一样的,搁谁都有点难以置信.后面的结论会更加让你吃惊. ...

  10. Django积木块七——视频

    视频 # 在网上搜索video.js然后下载相关的js和css文件,看文档正确使用视频模块,添加视频外链 <div style="width: 1200px;height: 675px ...