0

0

Python面向对象编程中关于类和方法

高洛峰

高洛峰

发布时间:2017-03-01 13:33:38

|

1997人浏览过

|

来源于php中文网

原创

类和实例

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

物以类聚

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

class Person(object):
  pass

NetPb网上党支部系统 1.01
NetPb网上党支部系统 1.01

NetPb(Net Party branch)中文名称:网上党支部系统,是一款专门用于党员在线交流、信息管的内容系统,系统采用PHP+Mysql环境架构,基于国内著名开源系统Dedecms二次开发,整套系统在界面、程序部分修改,目的是为了更适合党员在线管理和交流. 进去/admin/login.php,默认用户名和密码为admin登录后进行相关设置,实用方法类似Dedecms

下载

立即学习Python免费学习笔记(深入)”;

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

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

立即学习Python免费学习笔记(深入)”;

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

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

立即学习Python免费学习笔记(深入)”;

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

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

me = Person('mink')

立即学习Python免费学习笔记(深入)”;

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

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免费学习笔记(深入)”;

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

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

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

立即学习Python免费学习笔记(深入)”;

创建了一个动物类, 生成了一个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

立即学习Python免费学习笔记(深入)”;

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

# 我们修改一下这个函数
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

立即学习Python免费学习笔记(深入)”;

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

# 再一次修改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

立即学习Python免费学习笔记(深入)”;

这里需要注意的是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

立即学习Python免费学习笔记(深入)”;

添加__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), 显示缺少参数

立即学习Python免费学习笔记(深入)”;

这说明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()

立即学习Python免费学习笔记(深入)”;

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

静态方法不能使用实例的属性和方法

静态方法不能使用类的属性和方法

静态方法可以通过类或实例调用

静态方法等于作用域在类中的全局函数

类方法(classmethod)

类方法可以使用类的属性和方法

类的方法可以使用静态方法

类的方法可以通过类或实例调用

更多Python面向对象编程中关于类和方法相关文章请关注PHP中文网!

相关专题

更多
php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

65

2025.12.31

php网站源码教程大全
php网站源码教程大全

本专题整合了php网站源码相关教程,阅读专题下面的文章了解更多详细内容。

43

2025.12.31

视频文件格式
视频文件格式

本专题整合了视频文件格式相关内容,阅读专题下面的文章了解更多详细内容。

35

2025.12.31

不受国内限制的浏览器大全
不受国内限制的浏览器大全

想找真正自由、无限制的上网体验?本合集精选2025年最开放、隐私强、访问无阻的浏览器App,涵盖Tor、Brave、Via、X浏览器、Mullvad等高自由度工具。支持自定义搜索引擎、广告拦截、隐身模式及全球网站无障碍访问,部分更具备防追踪、去谷歌化、双内核切换等高级功能。无论日常浏览、隐私保护还是突破地域限制,总有一款适合你!

41

2025.12.31

出现404解决方法大全
出现404解决方法大全

本专题整合了404错误解决方法大全,阅读专题下面的文章了解更多详细内容。

204

2025.12.31

html5怎么播放视频
html5怎么播放视频

想让网页流畅播放视频?本合集详解HTML5视频播放核心方法!涵盖<video>标签基础用法、多格式兼容(MP4/WebM/OGV)、自定义播放控件、响应式适配及常见浏览器兼容问题解决方案。无需插件,纯前端实现高清视频嵌入,助你快速打造现代化网页视频体验。

9

2025.12.31

关闭win10系统自动更新教程大全
关闭win10系统自动更新教程大全

本专题整合了关闭win10系统自动更新教程大全,阅读专题下面的文章了解更多详细内容。

8

2025.12.31

阻止电脑自动安装软件教程
阻止电脑自动安装软件教程

本专题整合了阻止电脑自动安装软件教程,阅读专题下面的文章了解更多详细教程。

3

2025.12.31

html5怎么使用
html5怎么使用

想快速上手HTML5开发?本合集为你整理最实用的HTML5使用指南!涵盖HTML5基础语法、主流框架(如Bootstrap、Vue、React)集成方法,以及无需安装、直接在线编辑运行的平台推荐(如CodePen、JSFiddle)。无论你是新手还是进阶开发者,都能轻松掌握HTML5网页制作、响应式布局与交互功能开发,零配置开启高效前端编程之旅!

2

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 0.6万人学习

Django 教程
Django 教程

共28课时 | 2.7万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.0万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号