Python系列之 - 面向对象(1)
python是一门面向对象的编程语言,python中的一切均是对象。
有对象就提到类,对象和类就像是儿子和老子的关系,是不可分的一对。
什么是类
类就是具有一些共同特性的事物的统称。好比人类,共有的特性是能说话、能走路、要吃饭、睡觉等共同特性
什么是对象
对象是类的实体,除了有人类的共有特性外也可能还有个体特性,比如两个人张三、李四就是两个不同的对象。
1 类的定义
class 类名称()
# 定义一个people类
class People():
pass
python中的类定义分为经典类和新式类,不过这种分类方式是正对python2.x来说的,在python3.x中定义的所有类默认都是新式类
# 经典类定义
class ClassidClass():
pass # 新式类定义
class NewClass(object):
pass
虽然在python3中都是新式类,但为了程序的规范,定义类时都采用新式类定义的方法定义类
2 对象的定义
严格说对象不是定义的,而是实例化来的。
# 定义类
class People(object):
pass # 实例化对象
zhangsan = People()
3 类成员
类的成员分为:字段、属性、方法
字段:
当创建完一个类后,系统就在内存中分配一块地址用来保存类信息,当实例化一个对象时,系统会再次开辟一块内存空间用来保存实例化的对象信息,但在实例化对象时,仅将类中的普通字段加载到对象的内存空间,其它的所有类成员地址都保存在类的内存空间中。
换言之:
普通字段属于对象,在所有对象中都保存一份,通过对象访问
静态字段属于类,保存在类中,通过类访问
方法:
简单的说就是类中定义的函数就是类方法。这个函数和普通的非类中的函数有什么区别呢?类函数(方法)只能被类或类的实例化对象访问,其它对象无法访问。而普通函数可以被任何对象访问。
在类的方法中有一种比较特殊的方法 init() ,这个交构造函数。当类中有此方法是,实例化一个对象时将自动调用该函数。
属性:
和类方法一样,只是在函数的上面多了一个@property装饰器,只要加了这个装饰器名,就成为一个属性。属性在调用时可以不用加括号,而且属性是没有参数的。而方法需要加括号。
以下为类的所有成员及调用例子:
# 定义类
class People(object):
# 静态字段
country = "china" # 构造函数
def __init__(self, name):
# 普通字段
self.name = name # 方法
def talk(self):
print("{0} 说话".format(self.name)) # 属性
@property
def drink(self):
print("{0} 喝水".format(self.name)) # 实例化对象
zhangsan = People("张三")
print(zhangsan.name)
# 方法调用
zhangsan.talk()
# 属性调用
zhangsan.drink
类及对象内存分配方式
对象zhangsan在实例化是只是将普通字段copy一份到新的内存空间,其它所有属性及方法都存在类空间中。
4 对象方法调用
既然属性及方法存在类中,那么对象调用 talk()方法、drink方法时是如何调用的呢,图中看到对象实例化时存了一份类的地址指针。当调用talk()方法时,实质是:
zhangsan.talk() = People.talk(zhangsan)
这就要说到self到底是个什么东西:
其实从上面讲到的可以看到,self其实就是zhangsan这个对象本身。
方法分类
类方法分为3类:
普通方法: 至少有一个 self 默认参数,由实例化对象调用。无任何装饰器.
普通方法可以访问对象属性,也可以访问类属性。
类方法: 至少有一个 cls 默认参数 , 由类调用。有@classmethod装饰器。
类方法只能访问类属性,无法访问对象属性
静态方法: 没有默认参数,由类调用。有@staticmethod装饰器。 只能访问静态方法中定义的变量。
无法访问类属性,也无法访问对象属性
# 定义类
class People(object):
# 静态字段
country = "china" # 构造函数
def __init__(self, name):
# 普通字段
self.name = name # 普通方法
def talk(self):
print("{0} 说话".format(self.name)) # 静态方法
@staticmethod
def eat():
print("静态方法") # 类方法
@classmethod
def class_walk(cls):
print("类方法:走路") # 属性
@property
def drink(self):
print("{0} 喝水".format(self.name)) # 实例化对象
zhangsan = People("张三")
print(zhangsan.name)
# 普通方法调用
zhangsan.talk()
# 类方法调用
People.class_walk()
# 静态方法
People.eat()
属性
属性定义方式: 普通方法加@property装饰器
属性功能: 实现一些内部计算或逻辑处理,调用时可以实现和字段一样的效果
属性特性: 普通方法一样定义,但区别是只有一个默认参数 self
class Goods(object):
def __init__(self):
# 原价
self.original_price = 100
# 折扣
self.discount = 0.8 @property
def price(self):
# 实际价格 = 原价 * 折扣
new_price = self.original_price * self.discount
return new_price p = Goods()
# 调用
print(p.price) # 80.0
属性的@property装饰其实是一个类,这个类构造时有4个参数:
property(fget=None, fset=None, fdel=None, doc=None) -> property attribute
fget,fset,fdel分别是3个函数用来实现对类字段的属性值进行操作获取值、设置值、删除值
doc 是描述信息
还是上面的例子,我们改变一下:
class Goods(object):
def __init__(self):
# 原价
self.original_price = 100
# 折扣
self.discount = 0.8 @property
def price(self):
# 实际价格 = 原价 * 折扣
new_price = self.original_price * self.discount
return new_price @price.setter
def price(self, value):
self.original_price = value @price.deleter
def price(self):
del self.original_price good = Goods()
print(good.price) # 获取商品实际价格 调用fget方法 = 80.0
good.price = 200 # 调整商品原价为200,调用fset方法
print(good.price) # =160.0
del good.price # 调用fdel方法, 删除了类字段
print(good.price) # AttributeError: 'Goods' object has no attribute 'original_pric
Python系列之 - 面向对象(1)的更多相关文章
- Python系列之 - 面向对象(2)
类的三大特性 类的三大特性包括: 封装.继承.多态 一 封装 封装就是将类所用到的所有字段.属性.方法都包含在类代码段里面,当实例调用直接调用类中的方法即可. class People(object) ...
- python系列十六:Python3 面向对象
#!/usr/bin/python #-*-coding:gbk-*- #Python3 面向对象 '''面向对象技术简介 类(Class): 用来描述具有相同的属性和方法的对象的集合.它定义了 ...
- Python 基础 四 面向对象杂谈
Python 基础 四 面向对象杂谈 一.isinstance(obj,cls) 与issubcalss(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls ...
- 自学Python之路-Python基础+模块+面向对象+函数
自学Python之路-Python基础+模块+面向对象+函数 自学Python之路[第一回]:初识Python 1.1 自学Python1.1-简介 1.2 自学Python1.2-环境的 ...
- 懂一点Python系列——快速入门
本文面相有 一定编程基础 的朋友学习,所以略过了 环境安装.IDE 搭建 等一系列简单繁琐的事情. 一.Python 简介 Python 英文原意为 "蟒蛇",直到 1989 年荷 ...
- python 高级之面向对象初级
python 高级之面向对象初级 本节内容 类的创建 类的构造方法 面向对象之封装 面向对象之继承 面向对象之多态 面向对象之成员 property 1.类的创建 面向对象:对函数进行分类和封装,让开 ...
- python高级之面向对象高级
python高级之面向对象高级 本节内容 成员修饰符 特殊成员 类与对象 异常处理 反射/自省 单例模式 1.成员修饰符 python的类中只有私有成员和公有成员两种,不像c++中的类有公有成员(pu ...
- 总结整理 -- python系列
python系列 python--基础学习(一)开发环境搭建,体验HelloWorld python--基础学习(二)判断 .循环.定义函数.继承.调用 python--基础学习(三)字符串单引号.双 ...
- [python 译] 基于面向对象的分析和设计
[python 译] 基于面向对象的分析和设计 // */ // ]]> [python 译] 基于面向对象的分析和设计 Table of Contents 1 原文地址 2 引言 2.1 ...
随机推荐
- Eclipse中JRE(unbound)问题的一种解决方法
(如果有写的不对的地方,欢迎指正!) 1.检查Java环境变量配置是否有问题 jdk1.8环境变量配置(1.8和8是一个意思) jdk9环境变量配置 注:配置不成功的一种可能是安装多个jdk,解决方法 ...
- nodejs批量导入数据eventproxy(回调函数嵌套解决方案)使用实例
回调函数嵌套解决方案——eventProxy API地址:https://github.com/JacksonTian/eventproxy 1.安装eventproxy 执行npm install ...
- protobuf的下载、编译和使用
一 背景 工作中临时需要使用 protobuf v3.0.2 做消息格式转换,折腾了很久才搞定,这里特意做一个记录. 二 准备工作 全程使用的电脑为公司的win7 64位旗舰版,已经预先安装VS201 ...
- 常用数据库连接池 (DBCP、c3p0、Druid) 配置说明
1. 引言 1.1 定义 数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出.对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标.数据库 ...
- SpringBoot 整合 Swagger2
1. Swagger UI 按以下步骤配置,项目启动后访问:http://localhost:8080/swagger-ui.html 1.1 添加依赖 <dependency> < ...
- Oracle查询优化改写--------------------高级查询
一.给结果集分页 二.重新生成房间号 三.跳过表中n行 四.排列组合去重
- 使用Python中的mock模块进行单元测试
在进行单元测试的时候,有时候会遇到这种情况: 出于某些原因,我们不想测试某一部分内容,但是我们想要测试的部分却依赖这部分内容. 这时候,可以使用mock模块来模拟调用这部分内容,并给出返回结果,举例如 ...
- html5 input type="color"边框伪类效果
html5为input提供了新的类型:color <input type="color" value="#999" id="color" ...
- 利用jmeter进行数据库测试
1.首先,用jmeter进行数据库测试之前,要把oracle和mysql的JDBC驱动jar包放到jmeter安装路径的lib目录下,否则会提示错误 2.添加一个线程组,如下图 3.接下来添加一个JD ...
- alpha冲刺第六天
一.合照 二.项目燃尽图 三.项目进展 主界面首页内容呈现 我的栏目之我的问题完成 我的栏目之我的提问完成 还是插不进去,然后打算先放一放,一直在一个地方纠结那么久脑子太乱 四.明日规划 问答界面问题 ...