python 面向对象(类)
面向对象,即是将具备某种共性的事物抽象成一个类(模板),然后再根据类来创建实例对象进行具体的使用。
概述
- 面向过程:根据业务逻辑从上到下写垒代码
- 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可
- 面向对象:对函数进行分类和封装,让开发“更快更好更强...”
本节学习目标:
- 创建类和对象
- 面向对象三大特性:封装、继承、多态
- 类成员:变量(类变量,实例变量)、方法(普通方法,类方法,静态方法)、属性)
- 类和对象在内存中的保存情况
- 类成员修饰符:公有成员xx,私有成员__xx
- 类的特殊成员:__doc__,__module__,__class__,__init__,__call__,__dict__,__str__
创建类和对象
- class Car(object): # 创建类
- can_run=True # 类变量
- def __init__(self,name): # 构造函数
- self.name=name # 实例变量
- def run(self):
- return '%s run...' %self.name
- bmw=Car("BMW") # 通过类创建实例对象
- print bmw.can_run # 通过实例对象调用类变量
- print bmw.run() # 通过实例变量调用方法
运行结果:
- True
- BMW run...
面向对象的三大特性:封装、继承、多态
- class Person(object):
- sex = 'M'
- def __init__(self, name):
- self.name = name
- def speak(self):
- return 'Human can speak...'
- class Student(Person):
- ''' Student继承于Person'''
- id = 0 # 类变量,公有
- __score=60 # 类变量,私有
- def __init__(self, name, grade):
- super(Student, self).__init__(name)
- self.grade = grade # 实例变量
- Student.id += 1 # 每创建实例一次,类变量+1
- self.id = Student.id # 实例变量
- def job(self):
- return '%s is leaning in grade %s' % (self.name, self.grade)
- class Teacher(Person):
- def __init__(self, name, course):
- super(Teacher, self).__init__(name)
- self.course = course # 课程
- def job(self):
- return '%s is teaching %s' % (self.name, self.course)
- def speak(self):
- ''' 重写父类speak 方法'''
- return '%s can speak %s' % (self.name, self.course)
- # 根据Student类创建实例对象s1
- s1 = Student('Milton', 1)
- print 's1.name:', s1.name # 调用实例s1变量name
- print 's1.id:', s1.id
- print 's1.job:', s1.job() # 通过实例s1调用类方法
- # 继承父类的方法与属性
- print 's1.speak:', s1.speak()
- print 's1.sex:', s1.sex
- # 重写父类的方法
- t1 = Teacher('Loveyp', 'English')
- print 't1.speak:', t1.speak()
- # 多态
- for p in [Student('Perter', 1), Teacher('Marry', 'English')]:
- print p.job()
运行结果:
- 通过实例对象调用实例变量,类方法,类变量:
- s1.name: Milton
- s1.id: 1
- s1.count: 1
- s1.job: Milton is leaning in grade 1
- **************************************************
- 子类s1中继承父类的方法与属性:
- s1.speak: Human can speak...
- s1.sex: M
- **************************************************
- 子类重写父类的方法:
- t1.speak: Loveyp can speak English
- ******************************
- 多态:
- Perter is leaning in grade 1
- Marry is teaching English
类成员:变量(类变量,实例变量)、方法(普通方法,类方法,静态方法)、属性
- class Car(object):
- count = 0 # 类变量
- style = "SUV"
- tax = 0.8
- def __init__(self, name, money):
- self.name = name # 实例变量
- self.money = money
- Car.count += 1 # 调用类变量
- # 普通方法
- def run(self):
- return '%s run...' % self.name
- @classmethod # 类方法,类方法中不能使用实例变量
- def play_music(cls, song):
- return '%s car can playing music %s' % (cls.style, song)
- @staticmethod # 静态方法,不能直接使用类变量与实例变量
- def add_gas(name):
- return '%s can add_gas...' % name
- @property # 将方法设置为属性
- def price(self):
- return self.money * Car.tax
- @price.setter
- def price(self, money):
- self.money = money
- bmw = Car("BMW", 80)
- print "实例对象调用类变量:", bmw.count
- print "类直接调用类变量:", Car.count
- print "实例对象调用方法:", bmw.run()
- print "实例对象调用实例变量:", bmw.name
- try:
- Car.run()
- except Exception, e:
- print "类直接调用方法失败:", e
- aodi = Car("AODI", 100)
- print "实例对象调用类变量:", aodi.count
- print "类直接调用类变量:", Car.count
- print "实例对象调用类方法:", aodi.play_music("Hello World")
- print "类直接调用类方法:", Car.play_music("ABC")
- try:
- aodi.add_gas()
- except Exception, e:
- print "静态方法直接引用实例变量:", e
- print "静态方法中传入参数:", aodi.add_gas(aodi.name)
- print "修改属性前访问属性:",aodi.price
- aodi.price = 200
- print "修改属性后访问属性:",aodi.price
运行结果:
- 实例对象调用类变量: 1
- 类直接调用类变量: 1
- 实例对象调用方法: BMW run...
- 实例对象调用实例变量: BMW
- 类直接调用方法失败: unbound method run() must be called with Car instance as first argument (got nothing instead)
- 实例对象调用类变量: 2
- 类直接调用类变量: 2
- 实例对象调用类方法: SUV car can playing music Hello World
- 类直接调用类方法: SUV car can playing music ABC
- 静态方法直接引用实例变量: add_gas() takes exactly 1 argument (0 given)
- 静态方法中传入参数: AODI can add_gas...
- 修改属性前访问属性: 64.0
- 修改属性后访问属性: 160.0
类和对象在内存中的保存情况
- class Car(object):
- count = 0 # 类变量
- style = "SUV"
- def __init__(self, name):
- self.name = name # 实例变量
- Car.count += 1 # 调用类变量
- # 普通方法
- def run(self):
- return '%s run...' % self.name
- @classmethod # 类方法,类方法中不能使用实例变量
- def play_music(cls, song):
- return '%s car can playing music %s' % (cls.style, song)
- @staticmethod # 静态方法,不能直接使用类变量与实例变量
- def add_gas(name):
- return '%s can add_gas...' % name
- bmw = Car("BMW")
- bmw.color="white"
- aodi = Car("AODI")
类成员修饰符:公有成员xx,私有成员__xx
- class Car(object):
- __count = 0 # 类变量,私有
- style="SUV" # 类变量,公有
- def __init__(self, name):
- self.name = name # 实例变量
- Car.__count += 1 # 调用类变量
- bmw = Car("BMW")
- try:
- print bmw.__count
- except Exception,e:
- print "外部调用类私有变量:",e
- print "外部调用类公有变量:",bmw.style
运行结果:
- 外部调用类私有变量: 'Car' object has no attribute '__count'
- 外部调用类公有变量: SUV
类的特殊成员:__doc__,__module__,__class__,__init__,__call__,__dict__,__str__
- class Car(object):
- '''小车模型'''
- style = "SUV" # 类变量,公有
- def __init__(self, name):
- self.name = name # 实例变量
- print '__init__ function call...'
- def __call__(self, *args, **kwargs):
- print '__call__ function call...'
- def __str__(self):
- return "this is a nice card!"
- print "文档注释", Car.__doc__
- print "模块名:", Car.__module__
- print "类型:", Car.__class__
- bmw = Car("BMW")
- bmw()
- print "类成员:", Car.__dict__
- print "实例成员:", bmw.__dict__
- print "str 输出:", bmw
运行结果:
- 文档注释 小车模型
- 模块名: __main__
- 类型: <type 'type'>
- __init__ function call...
- __call__ function call...
- 类成员: {'__dict__': <attribute '__dict__' of 'Car' objects>, '__module__': '__main__', '__call__': <function __call__ at 0x039098F0>,
'__str__': <function __str__ at 0x03909870>, '__weakref__': <attribute '__weakref__' of 'Car' objects>, 'style': 'SUV',
'__init__': <function __init__ at 0x039098B0>, '__doc__': '\xe5\xb0\x8f\xe8\xbd\xa6\xe6\xa8\xa1\xe5\x9e\x8b'}- 实例成员: {'name': 'BMW'}
- str 输出: this is a nice card!
***微信扫一扫,关注“python测试开发圈”,了解更多测试教程!***
python 面向对象(类)的更多相关文章
- python面向对象(类和对象及三大特性)
类和对象是什么 创建类 新式类 和 经典类 面向对象三大特性 继承 封装 多态 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使 ...
- python 面向对象(类的特殊成员)
python 面向对象: (思维导图 ↑↑↑↑) 类的特殊成员 python的类成员存在着一些具有特殊含义的成员 1.__init__: 类名() 自动执行 __init__ class Foo(ob ...
- python面向对象(类的成员及类方法)
类的普通成员 字段 方法 属性 类的高级成员 静态字段 静态方法 属性方法 类方法 类成员修饰符 类的成员 类的成员可以分为三大类:字段.方法和属性 注:所有成员中,只有普通字段的内容保存对象中, ...
- python面向对象——类
from:http://www.runoob.com/python3/python3-class.html Python3 面向对象 Python从设计之初就已经是一门面向对象的语言,正因为如此,在P ...
- Python面向对象 --- 类的设计和常见的内置方法
面向对象:一种基于面向过程的新的编程思想.也就是说面向对象是将功能等通过对象来实现,将功能封装进对象之中,让对象去实现具体的细节:这种思想是将数据作为第一位,而方法或者说是算法作为其次,这是对数据一种 ...
- python 面向对象类与类之间的关系
主要内容: 1. 依赖关系 2. 关联关系, 组合关系, 聚合关系 3. 继承关系 4. 类中的特殊成员 引子 大千世界, 万物之间皆有规则和规律,我们的类和对象是对大千世界中的所有事物进行归类. 那 ...
- Python——面向对象(类)的基础疑难点
相信用Python写def函数大家都信手拈来了,但Python作为面向对象的编程语言,怎么能浪费呢? 那问题来了.什么是类呢?什么是实例?什么是对象?方法是什么??属性又是什么???继承?封装?多态? ...
- python面向对象--类
1.类的概念:简单来说就是一组符合逻辑的参数或者是函数,一个种类.一个模型. 一个类中可以包含任意参数,并且可以定义任意个方法,但类并不是随意的将多个参数或者方法包含在class下,而是创建一个在事物 ...
- python: 面向对象:类和对象调用类中的变量和方法
一. 面向对象初识 我们在生活中做事都是面向过程的,前面实现一些基本逻辑功能代码也是用面向过程的语句实现的,后来学了函数,把这些功能又装到了函数里.但用面向过程的方法去写程序,只能实现一个功能,我们要 ...
随机推荐
- 锐捷与Vmare网络冲突解决办法
首先,禁用掉VMare的两个适配器,然后在我的电脑右键管理中找到服务,把VMare的所有服务开起来,并把手动改成自动,最后把VMare的网络设置设置为NAT连接即可.
- MogileFS系统简单配置实例
实验原理: MogileFS是一个开源的分布式文件系统,用于组建分布式文件集群,由LiveJournal旗下DangaInteractive公司开发,Danga团队开发了包括 Memcached.Mo ...
- 【Windows编程】系列第三篇:文本字符输出
上一篇我们展示了如何使用Windows SDK创建基本控件,本篇来讨论如何输出文本字符. 在使用Win32编程时,我们常常要输出文本到窗口上,Windows所有的文本字符或者图形输出都是通过图形设备接 ...
- 帆软报表FineReport2016年1月份产品更新一览
.条件属性可使用页码参数插件 由于报表计算逻辑关系,条件属性中取不到页码公式.但是有些场景下又是需要在条件属性中取到页码的,比如标题只要偶数页显示,比如奇数页标题标红等等. 插件安装完成后,条件属性里 ...
- VB.NET中图像处理的一些技巧以及其和C#图像处理的差距。
早期的时候我使用的开发工具是VB6,VB6做图像处理的速度在我的软件Imageshop中有所体现,还是算可以的.目前,我已经改用C#来研究图像算法,C#中有指针,做图像处理起来效率确实要高不少.VB. ...
- POJ2406Power Strings[KMP 失配函数]
Power Strings Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 45005 Accepted: 18792 D ...
- 第16章 List集合的总结和遍历
第16章 List集合的总结和遍历 1.重构设计 根据Vector类,ArrayList类,和LinkedList类所具有的存储特点以及拥有的方法入手,发现共性往上抽取. 共同特点: 1.允许元素重复 ...
- [No000070]Flash与C#通信
注册控件 首先要插入Flash就必须使用Flash控件,在工具栏右键选择"选择项…",然后在"COM组件"面板下点击"浏览"按钮,在本机电脑 ...
- Intellij Idea中定制getter setter的模板
Alt + Ins, 调出快捷菜单后选择 Getter and Setter, 在对话框里, 选择对应的template, 右侧点开后, 可以新建自己的模板并编辑 将getter和setter都生成到 ...
- break prefab instance的原理
prefab可无限apply: 如果把一个模块做成了prefab,这个prefab可能在同一个scene中添加多个,甚至添加到了多个scene中.设所有这些实例为instance(1),instanc ...