面向对象,即是将具备某种共性的事物抽象成一个类(模板),然后再根据类来创建实例对象进行具体的使用。

概述

  • 面向过程:根据业务逻辑从上到下写垒代码
  • 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可
  • 面向对象:对函数进行分类和封装,让开发“更快更好更强...”

本节学习目标:

  • 创建类和对象
  • 面向对象三大特性:封装、继承、多态
  • 类成员:变量(类变量,实例变量)、方法(普通方法,类方法,静态方法)、属性)
  • 类和对象在内存中的保存情况
  • 类成员修饰符:公有成员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 面向对象(类)的更多相关文章

  1. python面向对象(类和对象及三大特性)

    类和对象是什么 创建类 新式类 和 经典类 面向对象三大特性 继承 封装 多态   面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使 ...

  2. python 面向对象(类的特殊成员)

    python 面向对象: (思维导图 ↑↑↑↑) 类的特殊成员 python的类成员存在着一些具有特殊含义的成员 1.__init__: 类名() 自动执行 __init__ class Foo(ob ...

  3. python面向对象(类的成员及类方法)

    类的普通成员 字段 方法 属性 类的高级成员 静态字段 静态方法 属性方法   类方法 类成员修饰符 类的成员 类的成员可以分为三大类:字段.方法和属性 注:所有成员中,只有普通字段的内容保存对象中, ...

  4. python面向对象——类

    from:http://www.runoob.com/python3/python3-class.html Python3 面向对象 Python从设计之初就已经是一门面向对象的语言,正因为如此,在P ...

  5. Python面向对象 --- 类的设计和常见的内置方法

    面向对象:一种基于面向过程的新的编程思想.也就是说面向对象是将功能等通过对象来实现,将功能封装进对象之中,让对象去实现具体的细节:这种思想是将数据作为第一位,而方法或者说是算法作为其次,这是对数据一种 ...

  6. python 面向对象类与类之间的关系

    主要内容: 1. 依赖关系 2. 关联关系, 组合关系, 聚合关系 3. 继承关系 4. 类中的特殊成员 引子 大千世界, 万物之间皆有规则和规律,我们的类和对象是对大千世界中的所有事物进行归类. 那 ...

  7. Python——面向对象(类)的基础疑难点

    相信用Python写def函数大家都信手拈来了,但Python作为面向对象的编程语言,怎么能浪费呢? 那问题来了.什么是类呢?什么是实例?什么是对象?方法是什么??属性又是什么???继承?封装?多态? ...

  8. python面向对象--类

    1.类的概念:简单来说就是一组符合逻辑的参数或者是函数,一个种类.一个模型. 一个类中可以包含任意参数,并且可以定义任意个方法,但类并不是随意的将多个参数或者方法包含在class下,而是创建一个在事物 ...

  9. python: 面向对象:类和对象调用类中的变量和方法

    一. 面向对象初识 我们在生活中做事都是面向过程的,前面实现一些基本逻辑功能代码也是用面向过程的语句实现的,后来学了函数,把这些功能又装到了函数里.但用面向过程的方法去写程序,只能实现一个功能,我们要 ...

随机推荐

  1. Asp.Net MVC+BootStrap+EF6.0实现简单的用户角色权限管理2

    首先我们来写个类进行获取当前线程内唯一的DbContext using System; using System.Collections.Generic; using System.Data.Enti ...

  2. TCP通信丢包原因总结

    今天在公司问老大,公司的项目底层,是使用的TCP,因为可靠,自动断线重连,在底层都实现了,但是我记得TCP也会有掉包的问题,所以这文章就诞生了——关于TCP掉包的问题,TCP是基于不可靠的网络实现可靠 ...

  3. 谈谈Redis的SETNX

    谈谈Redis的SETNX 发表于2015-09-14 在 Redis 里,所谓 SETNX,是「SET if Not eXists」的缩写,也就是只有不存在的时候才设置,可以利用它来实现锁的效果,不 ...

  4. MVC PartialView

      参考 Updating an MVC Partial View with Ajax RenderPartial vs RenderAction vs Partial vs Action in MV ...

  5. Unix哲学

    01. 模块原则:使用简洁的接口拼合简单的部件. 02. 清晰原则:清晰胜于机巧. 03. 组合原则:设计时考虑拼接组合. 04. 分离原则:策略同机制分离,接口同引擎分离. 05. 简洁原则:设计要 ...

  6. 【2016-10-17】【坚持学习】【Day9】【反射】

    3个主要命名空间 System.Type System.Reflection System.Reflection.Assembly 2个主要类 System.Type System.Reflectio ...

  7. 一分钟搞定AlloyTouch图片轮播

      一分钟搞定AlloyTouch图片轮播 轮播图也涉及到触摸和触摸反馈,同时,AlloyTouch可以把惯性运动打开或者关闭,并且设置min和max为运动区域,超出会自动回弹.除了一般的竖向滚动,A ...

  8. Linux编译安装源码包的流程

    流程: 1.  下载并解压源码包2.  运行:configure3.  编译:make4.  安装:make install 编译时需要注意一个原则:不要在解压的包中直接执行./configure.m ...

  9. DEDE整站动态化或整站静态化设置方法,织梦栏目批量静态/动态方法

    跟版网建站接到一个朋友提问,100多各栏目全部要从动态变成静态,里面的文章也要静态化,如何更快捷的设置dede的静态化或者动态化呢? 直接用DEDE后台的SQL命令行工具, SQL语句: DEDE整站 ...

  10. Python-11-RabbitMQ、Redis使用

    RabbitMQ RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统.他遵循Mozilla Public License开源协议. MQ全称为Message Queue, 消息队列(M ...