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使用QQ邮箱发送Email的方法实例
Feb 09 Python
Python命令启动Web服务器实例详解
Feb 23 Python
Python算法输出1-9数组形成的结果为100的所有运算式
Nov 03 Python
详解Python if-elif-else知识点
Jun 11 Python
python re库的正则表达式入门学习教程
Mar 08 Python
一篇文章弄懂Python中所有数组数据类型
Jun 23 Python
解决Django加载静态资源失败的问题
Jul 28 Python
python nmap实现端口扫描器教程
May 28 Python
用Python在Excel里画出蒙娜丽莎的方法示例
Apr 28 Python
Python面向对象多态实现原理及代码实例
Sep 16 Python
详解Python中第三方库Faker
Sep 25 Python
Pytorch 统计模型参数量的操作 param.numel()
May 13 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常用函数总结(数组,字符串,时间,文件操作)
2013/06/27 PHP
PHP常见漏洞攻击分析
2016/02/21 PHP
js 刷新页面的代码小结 推荐
2010/04/02 Javascript
jQuery实现下拉框左右选择的简单实例
2014/02/22 Javascript
node.js中的fs.open方法使用说明
2014/12/17 Javascript
使用jquery 简单实现下拉菜单
2015/01/14 Javascript
js实现select跳转菜单新窗口效果代码分享(超简单)
2015/08/21 Javascript
js实现类似MSN提示的页面效果代码分享
2015/08/24 Javascript
【经验总结】编写JavaScript代码时应遵循的14条规律
2016/06/20 Javascript
JavaScript代码里的判断小结
2016/08/22 Javascript
微信小程序 css使用技巧总结
2017/01/09 Javascript
微信小程序实战之仿android fragment可滑动底部导航栏(4)
2020/04/16 Javascript
Vue2.0 v-for filter列表过滤功能的实现
2018/09/07 Javascript
JS html事件冒泡和事件捕获操作示例
2019/05/01 Javascript
js贪心算法 钱币找零问题代码实例
2019/09/11 Javascript
解决vue-cli项目开发运行时内存暴涨卡死电脑问题
2019/10/29 Javascript
Python的lambda匿名函数的简单介绍
2013/04/25 Python
Python利用turtle库绘制彩虹代码示例
2017/12/20 Python
python Pandas 读取txt表格的实例
2018/04/29 Python
Python实现线性插值和三次样条插值的示例代码
2019/11/13 Python
python实现猜拳游戏
2020/03/04 Python
Python使用tkinter实现摇骰子小游戏功能的代码
2020/07/02 Python
几个CSS3的flex弹性盒模型布局的简单例子演示
2016/05/12 HTML / CSS
马来西亚和新加坡巴士票在线预订:CatchThatBus
2018/11/17 全球购物
澳大利亚设计的婴儿和女孩的衣服:Oobi
2018/12/16 全球购物
JSF面试题:如何管量web层中的Bean,用什么标签。如何通过jsp页面与Bean绑定在一起进行处理?
2012/10/05 面试题
OLEDBConnection和SQLConnection有什么区别
2013/05/31 面试题
学校联谊活动方案
2014/02/15 职场文书
高中微机老师自我鉴定
2014/02/16 职场文书
低碳环保口号
2014/06/12 职场文书
我的中国梦演讲稿初中篇
2014/08/19 职场文书
计划生育个人总结
2015/03/02 职场文书
2016廉洁从业学习心得体会
2016/01/19 职场文书
Django开发RESTful API实现增删改查(入门级)
2021/05/10 Python
Python3中PyQt5简单实现文件打开及保存
2021/06/10 Python
Java 超详细讲解十大排序算法面试无忧
2022/04/08 Java/Android