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的print用法示例
Feb 11 Python
Python实现的数据结构与算法之链表详解
Apr 22 Python
讲解Python中if语句的嵌套用法
May 14 Python
python计算日期之间的放假日期
Jun 05 Python
15行Python代码实现网易云热门歌单实例教程
Mar 10 Python
[机器视觉]使用python自动识别验证码详解
May 16 Python
wxPython实现整点报时
Nov 18 Python
浅谈PyQt5中异步刷新UI和Python多线程总结
Dec 13 Python
6行Python代码实现进度条效果(Progress、tqdm、alive-progress​​​​​​​和PySimpleGUI库)
Jan 06 Python
python实现tail -f 功能
Jan 17 Python
Python PyPDF2模块安装使用解析
Jan 19 Python
解决TensorFlow GPU版出现OOM错误的问题
Feb 03 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
PHP5 字符串处理函数大全
2010/03/23 PHP
PHP按行读取文件时删除换行符的3种方法
2014/05/04 PHP
ThinkPHP权限认证Auth实例详解
2014/07/22 PHP
PHP实现Snowflake生成分布式唯一ID的方法示例
2020/08/30 PHP
filemanage功能中用到的common.js
2007/04/08 Javascript
图片连续滚动代码[兼容IE/firefox]
2009/06/11 Javascript
JQuery实现的在新窗口打开链接的方法小结
2010/04/22 Javascript
模拟jQuery ajax服务器端与客户端通信的代码
2011/03/28 Javascript
解析Javascript小括号“()”的多义性
2013/12/03 Javascript
Jquery 改变radio/checkbox选中状态,获取选中的值(示例代码)
2013/12/12 Javascript
js实现鼠标悬停图片上时滚动文字说明的方法
2015/02/17 Javascript
基于JS实现弹出一个隐藏的div窗口body页面变成灰色并且不可被编辑
2016/12/14 Javascript
微信小程序实现图片压缩功能
2018/01/26 Javascript
Node.js静态服务器的实现方法
2018/02/28 Javascript
Vue实现移动端左右滑动效果的方法
2018/11/27 Javascript
聊聊Vue 中 title 的动态修改问题
2019/06/11 Javascript
使用layui日期控件laydate对开始和结束时间进行联动控制的方法
2019/09/06 Javascript
vue实现直播间点赞飘心效果的示例代码
2019/09/20 Javascript
解决父组件将子组件作为弹窗调用只执行一次created的问题
2020/07/24 Javascript
python使用datetime模块计算各种时间间隔的方法
2015/03/24 Python
K-近邻算法的python实现代码分享
2017/12/09 Python
使用Eclipse如何开发python脚本
2018/04/11 Python
django多文件上传,form提交,多对多外键保存的实例
2019/08/06 Python
pymysql模块的使用(增删改查)详解
2019/09/09 Python
Python Django框架防御CSRF攻击的方法分析
2019/10/18 Python
Python命名空间及作用域原理实例解析
2020/08/12 Python
CSS3 :default伪类选择器使用简介
2018/03/15 HTML / CSS
迪斯尼假期(欧洲、中东及非洲):Disney Holidays EMEA
2021/02/15 全球购物
高级人员简历的自我评价分享
2013/11/03 职场文书
办公室人员先进事迹
2014/01/27 职场文书
班子四风对照检查材料
2014/08/21 职场文书
2014年团委工作总结
2014/11/13 职场文书
投诉书格式范本
2015/07/02 职场文书
Python中seaborn库之countplot的数据可视化使用
2021/06/11 Python
再次探讨go实现无限 buffer 的 channel方法
2021/06/13 Golang
简单聊聊Vue中的计算属性和属性侦听
2021/10/05 Vue.js