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)的更多相关文章

  1. Python系列之 - 面向对象(2)

    类的三大特性 类的三大特性包括: 封装.继承.多态 一 封装 封装就是将类所用到的所有字段.属性.方法都包含在类代码段里面,当实例调用直接调用类中的方法即可. class People(object) ...

  2. python系列十六:Python3 面向对象

    #!/usr/bin/python #-*-coding:gbk-*- #Python3 面向对象 '''面向对象技术简介    类(Class): 用来描述具有相同的属性和方法的对象的集合.它定义了 ...

  3. Python 基础 四 面向对象杂谈

    Python 基础  四  面向对象杂谈 一.isinstance(obj,cls) 与issubcalss(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls ...

  4. 自学Python之路-Python基础+模块+面向对象+函数

    自学Python之路-Python基础+模块+面向对象+函数 自学Python之路[第一回]:初识Python    1.1 自学Python1.1-简介    1.2 自学Python1.2-环境的 ...

  5. 懂一点Python系列——快速入门

    本文面相有 一定编程基础 的朋友学习,所以略过了 环境安装.IDE 搭建 等一系列简单繁琐的事情. 一.Python 简介 Python 英文原意为 "蟒蛇",直到 1989 年荷 ...

  6. python 高级之面向对象初级

    python 高级之面向对象初级 本节内容 类的创建 类的构造方法 面向对象之封装 面向对象之继承 面向对象之多态 面向对象之成员 property 1.类的创建 面向对象:对函数进行分类和封装,让开 ...

  7. python高级之面向对象高级

    python高级之面向对象高级 本节内容 成员修饰符 特殊成员 类与对象 异常处理 反射/自省 单例模式 1.成员修饰符 python的类中只有私有成员和公有成员两种,不像c++中的类有公有成员(pu ...

  8. 总结整理 -- python系列

    python系列 python--基础学习(一)开发环境搭建,体验HelloWorld python--基础学习(二)判断 .循环.定义函数.继承.调用 python--基础学习(三)字符串单引号.双 ...

  9. [python 译] 基于面向对象的分析和设计

    [python 译] 基于面向对象的分析和设计 // */ // ]]>   [python 译] 基于面向对象的分析和设计 Table of Contents 1 原文地址 2 引言 2.1 ...

随机推荐

  1. Clion下jni配置

    Clion非常适合写C++程序 首先把C:\Program Files\Java\jdk1.7.0_79\include和C:\Program Files\Java\jdk1.7.0_79\inclu ...

  2. git 菜鸟入门

    1. 推荐的 git 仓库(注册帐号并登录): https://github.com/ https://git.oschina.net/2. 创建仓库       里面的地址为 git 仓库的地址 , ...

  3. SSM 使用 mybatis 分页插件 pagehepler 实现分页

    使用分页插件的原因,简化了sql代码的写法,实现较好的物理分页,比写一段完整的分页sql代码,也能减少了误差性. Mybatis分页插件 demo 项目地址:https://gitee.com/fre ...

  4. WordCount程序代码解

    package com.bigdata.hadoop.wordcount; import java.io.IOException; import org.apache.hadoop.conf.Conf ...

  5. 剑指Offer-数组中重复的数字

    package Array; /** * 数组中重复的数字 *在一个长度为n的数组里的所有数字都在0到n-1的范围内. * 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次 ...

  6. [模拟赛] T2 混合图

    Description Hzwer神犇最近又征服了一个国家,然后接下来却也遇见了一个难题. Hzwer的国家有n个点,m条边,而作为国王,他十分喜欢游览自己的国家.他一般 会从任意一个点出发,随便找边 ...

  7. linux服务器中毒可疑进程sfewfesfs CPU80%

    我用的是wdlinux, 难免会有漏洞,不知怎么就被莫名其妙地给入侵了,而且还频繁发包.下面是我查看攻击机器的整个过程. 首先跟客户要了root密码登录看,第一个命令是就top cd /proc/25 ...

  8. postman简单教程,使用tests模块来验证接口时是否通过

    接口测试醉重要的就是返回数据的检查,一个简单的接口,我们可以肉眼检查返回数据,但接口一旦多起来且复杂,每次的检查都会很费劲,此时我们就需要postman 的tests模块来代替 概念: Postman ...

  9. Angular开发实践(六):服务端渲染

    Angular Universal Angular在服务端渲染方面提供一套前后端同构解决方案,它就是 Angular Universal(统一平台),一项在服务端运行 Angular 应用的技术. 标 ...

  10. linux小白成长之路1————通过Parallels安装CentOS虚拟机

    以下是通过Mac版Parallels安装CentOS虚拟机的教程: 1.在Parallels向导中选择"下载CentOS",点击"继续":  2.点击&quo ...