Python面向对象编程中关于类和方法的学习笔记


Posted in Python onJune 30, 2016

类和实例
python是一个面向对象的语言,而面向对象最重要的概念就是类和实例, 记得刚学习的时候不太理解这些概念,直到老师说了一句”物以类聚”. 没错就是类, 归类

物以类聚

类其实就是把一些相同特性的事物归成一类, 比如人

class Person(object):
  pass

我们定义了人这个类, 但人有一些特性,比如 两个眼睛,一个嘴巴, 我们把这些添加进去

class Person(object):
  eyes = 2
  mouth = 1

已经把人的一些信息写进去了,但是人还有名字, 比如我mink. 好吧我不能亏待自己我得把这些添加进去

class Person(object):
  eyes = 2
  mouth = 1
  name = mink

太完美了,一个人终于完成了. 上帝用了一天我就用了一分钟(开个玩笑), 我们读一下信息. 人类他有两个眼睛,一个嘴巴,还有名字叫mink. - -! 有点不对,mink是我的名字啊~ 怎么人类叫mink呢
mink是人类的名字, 人类的名字是mink显然是错误的, “wo” 应该是人类的个体,是个单个例子

class Person(object):
  eyes = 2
  mouth = 1
  
  def __init__(self, name):
    self.name = name 

me = Person('mink')

现在我终于有了自己的名字而不是给大家共用, 这个方法叫实例但是我有一个别人不会的技能, 我不受重力影响.

class Person(object):
  eyes = 2
  mouth = 1

  def __init__(self, name)
    self.name = name 

  def jineng(self, txt):
    print "%s %s" % (self.name, txt)

me = Person('mink')
me.jineng("我不受重力影响, 我会飞")

类方法和静态方法
python中可以经常看到@classmethod和@staticmethod, 被称为类方法和实例方法.

class Animal(object):
  name = 'lili'
  age = 1

cat = Animal()
print cat.name, cat.age   # print 'lili' 1

创建了一个动物类, 生成了一个cat的实例, 打印cat的名字和年龄, 可以看出返回的是Animal这个类的属性, 也就是实例访问了类的属性

# 显示内容是一样的
print cat.name, cat.age
print Animal.name, Animal.age
给Animal类添加一个方法(函数)

class Animal(object):
  name = 'lili'
  age = 1

  def edit(self, name, age):
    self.name = name
    self.age = age

cat = Animal()
cat.edit('rol', 2)

print cat.name, cat.age     # print 'rol' 2
print Animal.name, Animal.age  # print 'lili' 1

也就是说这个默认添加的方法是一个实例的方法, 实例方法修改了实例的属性,而类的属性不改变

# 我们修改一下这个函数
def edit(self, name, age):
  name = name
  self.age = age

cat = Animal()
cat.edit('rol', 2)

print cat.name, cat.age     # pirnt 'rol' 2
print Animal.name, cat.age   # print 'lili' 1

说明实例方法不能修改类的属性, 但我想修改类的属性怎么办

# 再一次修改edit
@classmethod
def edit(cls, name, age):
  cls.name = name
  cls.age = age

cat = Animal()
cat.edit('rol', 2)

print cat.name, cat.age     # print 'rol' 2
print Animal.name, Animal.age  # print 'rol' 2

这里需要注意的是edit函数的第一个参数有self变为cls, python中建议大家在类的方法中使用cls而实例方法的参数为self, 而且这里说明了实例可以使用类的方法(函数)
那么我在给这个类添加init方法来初始化属性

class Animal(object):
  name = 'lili'
  age = 1

  def __init__(self, name, age):
    self.name = name
    self.age = age
  ...

cat = Animal('kuku', 4)
cat.edit('rol', 2)

print cat.name, cat.age     # print 'kuku' 4
print Animal.name, Animal.age  # print 'rol' 2

添加__init__以后, cat不再使用类的属性,而修改了edit方法也没有改变cat实例的属性.

# 添加staticmethod
@staticmethod
def say_name(name=None):
  if not name:
    name = self.name
  print 'my name is %s.' % name

cat = Animal('kaka', 3)
cat.say_name()        
# 运行的话会报 NameError: global name 'self' is not defined  
# 那是不是没给他添加self字段, 所以没找到
def say_name(self, name=None):
  ...

cat.say_name()
# TypeError: say_name() takes at least 1 argument(0 given), 显示缺少参数

这说明staticmethod 不能使用实例的属性和方法, 当然也使用不了类. 那么反过来呢

# 我们修改一下代码
# 先创建一个实例的方法, 他使用类的staticmethod

@staticmethod
def say_name(name):
  print 'my name is %s.' % name

def say(self):
  self.say_name(self.name)
  
@classmethod
def _say(cls):
  cls.say_name(cls.name)

cat = Animal('kaka', 3)
cat.say()
cat._say()

可以通过类方法和实例方法访问staticmethod.
总结一下:
静态方法(staticmethod)

  • 静态方法不能使用实例的属性和方法
  • 静态方法不能使用类的属性和方法
  • 静态方法可以通过类或实例调用
  • 静态方法等于作用域在类中的全局函数

类方法(classmethod)

  • 类方法可以使用类的属性和方法
  • 类的方法可以使用静态方法
  • 类的方法可以通过类或实例调用
Python 相关文章推荐
python网络编程之文件下载实例分析
May 20 Python
在Python的Flask中使用WTForms表单框架的基础教程
Jun 07 Python
利用python实现数据分析
Jan 11 Python
Python利用Django如何写restful api接口详解
Jun 08 Python
pandas Dataframe行列读取的实例
Jun 08 Python
pygame实现简易飞机大战
Sep 11 Python
Python3 实现文件批量重命名示例代码
Jun 03 Python
python二进制读写及特殊码同步实现详解
Oct 11 Python
Python 基于jwt实现认证机制流程解析
Jun 22 Python
Python导入父文件夹中模块并读取当前文件夹内的资源
Nov 19 Python
Python项目打包成二进制的方法
Dec 30 Python
Python图像处理之膨胀与腐蚀的操作
Feb 07 Python
Python中的time模块与datetime模块用法总结
Jun 30 #Python
详解Swift中属性的声明与作用
Jun 30 #Python
为Python的Tornado框架配置使用Jinja2模板引擎的方法
Jun 30 #Python
Python的Flask框架中的Jinja2模板引擎学习教程
Jun 30 #Python
Python的Tornado框架实现异步非阻塞访问数据库的示例
Jun 30 #Python
Python的Tornado框架实现图片上传及图片大小修改功能
Jun 30 #Python
举例讲解Python中metaclass元类的创建与使用
Jun 30 #Python
You might like
很让人受教的 提高php代码质量36计
2012/09/05 PHP
php获取指定日期之间的各个周和月的起止时间
2014/11/24 PHP
php中实现xml与mysql数据相互转换的方法
2014/12/25 PHP
PHP+JS三级菜单联动菜单实现方法
2016/02/24 PHP
yii2整合百度编辑器umeditor及umeditor图片上传问题的解决办法
2016/04/20 PHP
php使用parse_str实现查询字符串解析到变量中的方法
2017/02/17 PHP
PHP xpath提取网页数据内容代码解析
2020/07/16 PHP
JavaScript 对象模型 执行模型
2010/10/15 Javascript
Tab页界面 用jQuery及Ajax技术实现(php后台)
2011/10/12 Javascript
window.open关于浏览器拦截问题分析及解决方法
2013/02/05 Javascript
js实现简洁大方的二级下拉菜单效果代码
2015/09/01 Javascript
解决js函数闭包内存泄露问题的办法
2016/01/25 Javascript
jQuery 限制输入字符串长度
2016/06/20 Javascript
Bootstrap页面缩小变形的快速解决办法
2017/02/03 Javascript
使用ionic播放轮询广告的实现方法(必看)
2017/04/24 Javascript
Jquery+Ajax+xml实现中国地区选择三级联动菜单效果(推荐)
2017/06/09 jQuery
详解vue mint-ui源码解析之loadmore组件
2017/10/11 Javascript
在vue项目中使用Nprogress.js进度条的方法
2018/01/31 Javascript
nodeJS服务器的创建和重新启动的实现方法
2018/05/12 NodeJs
jquery层次选择器的介绍
2019/01/18 jQuery
Vant Weapp组件踩坑:picker的初始赋值解决
2020/11/12 Javascript
[32:39]完美世界DOTA2联赛循环赛 Forest vs Inki BO2第一场 11.04
2020/11/04 DOTA
python读取csv文件示例(python操作csv)
2014/03/11 Python
pygame学习笔记(4):声音控制
2015/04/15 Python
Python可视化mhd格式和raw格式的医学图像并保存的方法
2019/01/24 Python
python flask框架实现重定向功能示例
2019/07/02 Python
Python 操作mysql数据库查询之fetchone(), fetchmany(), fetchall()用法示例
2019/10/17 Python
如何写一个自定义标签
2012/12/28 面试题
广告学专业毕业生自荐信
2014/05/28 职场文书
坎儿井导游词
2015/02/09 职场文书
《怀念母亲》教学反思
2016/02/19 职场文书
导游词之烟台威海蓬莱
2019/11/14 职场文书
浅谈Python协程asyncio
2021/06/20 Python
5种 JavaScript 方式实现数组扁平化
2021/10/05 Javascript
SQL Server使用导出向导功能
2022/04/08 SQL Server
使用Django框架创建项目
2022/06/10 Python