9.python面向对象编程
基本概念
Class 类
一个类即是对一类拥有相同属性的对象的抽象、蓝图、原型。在类中定义了这些对象的都具备的属性(variables(data))、共同的方法
Object 对象
一个对象即是一个类的实例化后实例,一个类必须经过实例化后方可在程序中调用,一个类可以实例化多个对象,每个对象亦可以有不同的属性,就像人类是指所有人,每个人是指具体的对象,人与人之前有共性,亦有不同
Encapsulation 封装
在类中对数据的赋值、内部调用对外部用户是透明的,这使类变成了一个胶囊或容器,里面包含着类的数据和方法
Inheritance 继承
一个类可以派生出子类,在这个父类里定义的属性、方法自动被子类继承
Polymorphism 多态
一个接口,多种实现
类的创建

class Car(object):
def __init__(self,type,price):
self.type = type
self.price = price
def carinfo(self):
print("type:%s,price:%d"%(self.type,self.price))
tesla = Car('tesla',2000)
jeep = Car('jeep',1000)
tesla.carinfo()
jeep.carinfo()
对象之间的交互
class Garen:
camp = 'Demacia' def __init__(self,name,aggressivity = 58,life_value = 455): #初始攻击力和生命值
self.name = name
self.aggressivity = aggressivity
self.life_value = life_value def attack(self,enemy): #普通攻击技能,攻击敌人
enemy.life_value -= self.aggressivity #根据攻击力,减掉敌人生命值 class Riven:
camp = 'Noxus' def __init__(self,name,aggressivity = 54,life_value = 4514):
self.name = name
self.aggressivity = aggressivity
self.life_value = life_value def attack(self,enemy):
enemy.life_value -= self.aggressivity g1 = Garen('盖伦')
r1 = Riven("瑞文") print(g1.life_value)
r1.attack(g1) #交互
print(g1.life_value
继承
继承指的是类与类之间的关系,是一种什么是什么的关系,功能之一就是用来解决代码重用问题
继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类

class People(object):
def __init__(self,name,age):
self.name = name
self.age = age
def eat(self):
print("%s is eating..." % self.name)
def talk(self):
print("%s is talking..." % self.name)
def sleep(self):
print("%s is sleeping..." % self.name) class Man(People):
def __init__(self,name,age,money):
super(Man,self).__init__(name,age)
self.money = money
print("%s 一出生就有%s money" %(self.name,self.money))
def sleep(self):
print("man is sleeping ") class Woman(People):
def get_birth(self):
print("%s is born a baby...." % self.name) m1 = Man("jack",22,10000)
m1.sleep()
w1 = Woman("alex",26)
w1.get_birth()

组合
组合与继承都是有效地利用已有类的资源的重要方式。但是二者的概念和使用场景皆不同,
1.继承的方式
通过继承建立了派生类与基类之间的关系,它是一种'是'的关系,比如白马是马,人是动物。
当类之间有很多相同的功能,提取这些共同的功能做成基类,用继承比较好,比如老师是人,学生是人
2.组合的方式
用组合的方式建立了类与组合的类之间的关系,它是一种‘有’的关系,比如教授有生日,教授教python和linux课程,教授有学生s1、s2、s3...
class Equip():
def file(self):
print('release fire skill') class Riven():
camp = 'Noxus'
def __init__(self,name):
self.name = name
self.equip = Equip() #用Equip类产生一个装备,赋值给实例的equip属性 r1 = Riven('瑞文')
r1.equip.file() #可以使用组合的类产生的对象所持有的方法 结果:
release fire skill
继承与组合例子:
class People(object):
def __init__(self,name,age,sex):
self.name = name
self.age = age
self.sex = sex class Course(object):
def __init__(self,name,period,price):
self.name = name
self.period = period
self.price = price
def tell_info(self):
print('%s %s %s'%(self.name,self.period,self.price)) class Teacher(People):
def __init__(self,name,age,sex,job):
super(Teacher, self).__init__(name,age,sex)
self.job = job
self.course = []
self.students = [] class Student(People):
def __init__(self,name,age,sex):
super(Student, self).__init__(name,age,sex)
self.course = [] #老师和学生对象
jack = Teacher('jack',18,'male','c++')
s1 = Student('derek',12,'female')
#课程
python = Course('python','3mons',3000)
linux = Course('linux','4mons',5000)
#为老师和学生添加课程
jack.course.append(python)
jack.course.append(linux)
s1.course.append(linux)
#为老师添加学生
jack.students.append(s1)
#使用
for obj in jack.course:
obj.tell_info()
3.私有属性

方法
1.静态方法 (@staticmethod)
静态方法是不可以访问实例变量或类变量的,一个不能访问实例变量和类变量的方法,其实相当于跟类本身已经没什么关系了
class Dog(object):
def __init__(self,name):
self.name = name
@staticmethod
def eat():
print('is eating')
d = Dog('xiaohei')
d.eat()
2.类方法(@classmethod)
class Dog(object):
def __init__(self,name):
self.name = name
@classmethod
def eat(cls):
print('is eating')
d = Dog('xiaohei')
d.eat()
3.属性方法(@property)
class Dog(object):
def __init__(self,name):
self.name = name
@property
def eat(self):
print('is eating')
d = Dog('xiaohei')
d.eat
把一个方法变成一个静态属性,因为eat此时已经变成一个静态属性了, 不是方法了, 想调用已经不需要加()号了,直接d.eat就可以了
多态
所谓多态:定义时的类型和运行时的类型不一样,此时就成为多态
class F1(object):
def show(self):
print 'F1.show' class S1(F1): def show(self):
print 'S1.show' class S2(F1): def show(self):
print 'S2.show' def Func(obj):
print obj.show() s1_obj = S1()
Func(s1_obj) # 在Func函数中传入S1类的对象 s1_obj,执行 S1 的show方法,结果:S1.show s2_obj = S2()
Func(s2_obj) # 在Func函数中传入Ss类的对象 ss_obj,执行 Ss 的show方法,结果:S2.show
类的特殊方法
1.__doc__
表示类的描述信息
class Func():
""" 这里显示的是描述信息 """ def func(self):
pass
print(Func.__doc__) 结果:
这里显示的是描述信息
2.__str__
如果一个类中定义了__str__方法,那么在打印 对象 时,默认输出该方法的返回值。
class Foo:
def __str__(self):
return 'alex li'
obj = Foo()
print(obj) 结果:
alex li
3.反射
hasattr:判断一个对象是否有对应字符串方法
getattr:获取方法
setattr:添加方法
delattr:删除方法
def bulk(self): #添加的方法
print("%s is yelling...." %self.name) class Dog(object):
def __init__(self,name):
self.name = name def eat(self,food):
print("%s is eating..."%self.name,food) d = Dog("NiuHanYang")
choice = input(">>:").strip() if hasattr(d,choice): #输入的字符串,判断是否有对应字符串的方法
func1 = getattr(d,choice)
func1('')
else:
setattr(d,choice,bulk) #d.talk = bulk #通过setattr在类外部添加方法
func2 = getattr(d, choice)
func2(d) # if hasattr(d.choice): #删除
# delattr(d.choice)
4.__del__
创建对象后,python解释器默认调用__init__()方法;
当删除一个对象时,python解释器也会默认调用一个方法,这个方法为__del__()方法
9.python面向对象编程的更多相关文章
- python 面向对象编程学习
1. 问题:将所有代码放入一个py文件:无法维护 方案:如果将代码才分放到多个py文件,好处: 1. 同一个名字的变量互相不影响 2.易于维护 3.引用模块: import module 2.包:解决 ...
- python 面向对象编程(一)
一.如何定义一个类 在进行python面向对象编程之前,先来了解几个术语:类,类对象,实例对象,属性,函数和方法. 类是对现实世界中一些事物的封装,定义一个类可以采用下面的方式来定义: class c ...
- Python面向对象编程指南
Python面向对象编程指南(高清版)PDF 百度网盘 链接:https://pan.baidu.com/s/1SbD4gum4yGcUruH9icTPCQ 提取码:fzk5 复制这段内容后打开百度网 ...
- python面向对象编程进阶
python面向对象编程进阶 一.isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 1 ...
- Python面向对象编程(下)
本文主要通过几个实例介绍Python面向对象编程中的封装.继承.多态三大特性. 封装性 我们还是继续来看下上文中的例子,使用Student类创建一个对象,并修改对象的属性.代码如下: #-*- cod ...
- Python 面向对象编程——访问限制
<无访问限制的对象> 在Class内部,可以有属性和方法,而外部代码可以通过直接调用实例变量的方法来操作数据,这样,就隐藏了内部的复杂逻辑.但是,从前面Student类的定义来看(见:Py ...
- Python 面向对象编程 继承 和多态
Python 面向对象编程 继承 和多态 一:多继承性 对于java我们熟悉的是一个类只能继承一个父类:但是对于C++ 一个子类可以有多个父亲,同样对于 Python一个类也可以有多个父亲 格式: c ...
- Python 面向对象编程基础
Python 面向对象编程基础 虽然Pthon是解释性语言,但是Pthon可以进行面向对象开发,小到 脚本程序,大到3D游戏,Python都可以做到. 一类: 语法: class 类名: 类属性,方法 ...
- python面向对象编程学习
python面向对象编程 基本概念理解 面向对象编程--Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作 ...
- Python面向对象编程——继承与派生
Python面向对象编程--继承与派生 一.初始继承 1.什么是继承 继承指的是类与类之间的关系,是一种什么"是"什么的关系,继承的功能之一就是用来解决代码重用问题. 继承是一种创 ...
随机推荐
- MySQL运维相关工具汇总(待补充)
1.orztop查看show full processlist http://hidba.org/?p=841 2.orzdba查看系统状态信息 http://code.taobao.org/p/or ...
- git打包
git help tag #tag的用法git taggit tag -d xxx #删除taggit tag v1.1 #新增taggit describe --tag #
- HTML的用法
今天学习了HTMIL,标签.这个东西吧,没什么很难的,就是得多练多打.今天的一些个人心得: 标签:成对存在的名称 标签注意:1.标签名放在<> 2.标签成对存在的 3.结束标签有斜杠/ 例 ...
- 利用可变参数模拟Printf()函数实现一个my_print()函数和调用可变参数注意的陷阱!
可变参数函数的实现与函数调用的栈结构密切相关,正常情况下C的函数参数入栈规则为__stdcall, 它是从右到左的,即函数中的最右边的参数最先入栈. 例如,对于函数: void test(char a ...
- iOS swift的xcworkspace多项目管理(架构思想)
iOS swift的xcworkspace多项目管理(架构思想) 技术说明: 今天在这里分享 swift下的 xcworkspace多项目管理(架构思想),能为我们在开发中带来哪些便捷?能为我们对整 ...
- Java学习笔记13---如何理解“子类重写父类方法时,返回值若为类类型,则必须与父类返回值类型相同或为其子类”
子类重新实现父类的方法称重写:重写时可以修改访问权限修饰符和返回值,方法名和参数类型及个数都不可以修改:仅当返回值为类类型时,重写的方法才可以修改返回值类型,且必须是父类方法返回值的子类:要么就不修改 ...
- sqoop的导入导出
1.知道某列的值的增量导入(mysql------>文件) bin/sqoop import \--connect jdbc:mysql://bigdatcdh01:3306/test \--u ...
- c语言贪吃蛇详解3.让蛇动起来
c语言贪吃蛇详解3.让蛇动起来 前几天的实验室培训课后作业我布置了贪吃蛇,今天有时间就来写一下题解.我将分几步来教大家写一个贪吃蛇小游戏.由于大家c语言未学完,这个教程只涉及数组和函数等知识点. 上次 ...
- LINQ学习系列-----3.1 查询非泛型集合
一.问题起源 LINQ to object在设计时,是配合IEnumerable<T>接口的泛型集合类型使用的,例如字典.数组.List<T>等,但是对于继承了IEnumera ...
- 老男孩Python视频教程:第一周
认识和尝试Python 备注:老男孩Python视频教程,视频来自网络,在此分享,侵删 对我来说,第一周视频主要解答了以下疑问: 1. Python的三大特点是什么? 答:解释型.动态类型(运行期间才 ...