面向对象【day08】:静态方法、类方法、属性方法(九)
本节内容
- 概述
- 静态方法
- 类方法
- 属性方法
- 总结
一、概述
前面我们已经讲解了关于类的很多东西,今天讲讲类的另外的特性:静态方法(staticmethod)、类方法(classmethod)、属性方法(property)
二、静态方法
2.1 定义
说明:在方法名前加上@staticmethod装饰器,表示此方法为静态方法
|
1
2
3
4
5
6
7
8
|
class Dog(object): def __init__(self,name): self.name = name @staticmethod #在方法前加上staticmethod 装饰器定义静态方法 def eat(): print("dog is eating") |
2.2 静态方法特性
特性:只是名义上归类管理,实际上在静态方法里访问不了类或实例中的任何属性
①静态方法,是不可以传入self参数的,但是想传也可以,调用时必须传入实例本身
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
class Dog(object): def __init__(self,name): self.name = name @staticmethod #定义静态方法 def eat(self,food): #可以定义,但是需传入实例本身 print("{0} is eating {1}".format(self.name,food))d = Dog("shabi")d.eat(d,"hotdog") #传入实例d本身,否则会报错#输出shabi is eating hotdog |
②静态方法可以用类直接调用,直接调用时,不可以直接传入self,否则会报错
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
class Dog(object): def __init__(self,name): self.name = name @staticmethod def eat(food): print("is eating {0}".format(food))Dog.eat("hotdog")#输出is eating hotdog |
2.3 场景
一般情况下我们需要使用工具包的一些个类的封装,可以用静态方法,比如os模块
|
1
2
3
4
|
import osos.system()os.mkdir() |
上面两个方法没有什么必然的联系在里面,所以可以这么用
三、类方法
3.1 定义
说明:在方法名前加上@classmethod装饰器,表示此方法为类方法
|
1
2
3
4
5
6
7
8
9
|
class Dog(object): name = "honggege" #定义静态属性 def __init__(self,name): self.name = name @classmethod #定义类方法 def eat(self,food): print("{0} is eating {1}".format(self.name,food)) |
3.2 类方法特性
特性:只能访问类变量(又叫静态属性),不能访问实例变量
①访问实例变量
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
class Dog(object): def __init__(self,name): self.name = name @classmethod #定义类方法 def eat(self,food): print("{0} is eating {1}".format(self.name,food))d = Dog("shabihong")d.eat("hotdog")#输出 File "D:/PycharmProjects/pyhomework/day7/类方法.py", line 11, in <module> d.eat("hotdog") File "D:/PycharmProjects/pyhomework/day7/类方法.py", line 8, in eat print("{0} is eating {1}".format(self.name,food))AttributeError: type object 'Dog' has no attribute 'name' |
②访问类变量(又叫静态属性)
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
class Dog(object): name = "honggege" #定义类变量 def __init__(self,name): self.name = name @classmethod def eat(self,food): print("{0} is eating {1}".format(self.name,food))d = Dog("shabihong")d.eat("hotdog")#输出honggege is eating hotdog #调用的是类变量 |
3.3 使用场景
一个国家,有的国家不允许更改国籍,比如朝鲜,只能去访问写死的变量
四、属性方法
4.1 定义
说明: 在方法名前加上@property装饰器,表示此方法为属性方法
|
1
2
3
4
5
6
7
8
|
class Dog(object): def __init__(self,name): self.name = name @property #定义属性方法 def eat(self): print("{0} is eating".format(self.name)) |
4.2 特性
特性:把一个方法变成一个静态属性
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
class Dog(object): def __init__(self,name): self.name = name @property #定义属性方法 def eat(self): print("{0} is eating".format(self.name))d = Dog("shabihong")d.eat #把方法变成静态属性调用#输出shabihong is eating |
我去,按照上面的用法,那我想传入参数咋办呢?
①给转成的静态属性赋值
说明:用@静态方法名.setter去装饰方法,来给转换后的静态属性赋值
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
class Dog(object): def __init__(self,name): self.name = name @property #定义属性方法 def eat(self): print("{0} is eating {1}".format(self.name,"honggege")) @eat.setter #定义一个可以传参的方法 def eat(self,food): print("set to food:",food) # self.__food = foodd = Dog("shabihong")d.eat = "hotdog" #给转成的静态变量赋值d.eat#输出set to food: hotdogshabihong is eating honggege |
那有些用同学说了,你上面还是没有把food传上去啊,好的,我们现在就来更深入的,请看如下代码:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
class Dog(object): def __init__(self,name): self.name = name self.__food = None @property #定义属性方法 def eat(self): print("{0} is eating {1}".format(self.name,self.__food)) @eat.setter #定义可以设置变量赋值 def eat(self,food): print("set to food:",food) self.__food = foodd = Dog("shabihong")d.eat #第一份赋值的是Noned.eat = "hotdog"d.eat #第二个赋值是hotdog#输出shabihong is eating Noneset to food: hotdogshabihong is eating hotdog #说明赋值成功 |
②删除转变的静态属性
说明:用@静态方法名.deleter去装饰,表明可以删除转化后的静态属性
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
class Dog(object): def __init__(self,name): self.name = name self.__food = None @property def eat(self): print("{0} is eating {1}".format(self.name,self.__food)) @eat.setter def eat(self,food): print("set to food:",food) self.__food = food @eat.deleter #定义可以删除eat这个静态属性 def eat(self): del self.__food print("food 变量删除完毕")d = Dog("shabihong")del d.eat #删除静态属性eat#输出food 变量删除完毕 |
4.3 使用场景
你想知道一个航班当前的状态,是到达了、延迟了、取消了、还是已经飞走了, 想知道这种状态你必须经历以下几步:
1. 连接航空公司API查询
2. 对查询结果进行解析
3. 返回结果给你的用户
因此这个status属性的值是一系列动作后才得到的结果,所以你每次调用时,其实它都要经过一系列的动作才返回你结果,但这些动作过程不需要用户关心, 用户只需要调用这个属性就可以,明白 了么?
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
class Flight(object): def __init__(self,name): self.flight_name = name def checking_status(self): print("checking flight %s status " % self.flight_name) return 1 @property def flight_status(self): status = self.checking_status() if status == 0 : print("flight got canceled...") elif status == 1 : print("flight is arrived...") elif status == 2: print("flight has departured already...") else: print("cannot confirm the flight status...,please check later") @flight_status.setter #修改 def flight_status(self,status): status_dic = { 0 : "canceled", 1 :"arrived", 2 : "departured" } print("\033[31;1mHas changed the flight status to \033[0m",status_dic.get(status) ) @flight_status.deleter #删除 def flight_status(self): print("status got removed...")f = Flight("CA980")f.flight_statusf.flight_status = 2 #触发@flight_status.setterdel f.flight_status #触发@flight_status.deleter |
五、总结
- 静态方法是访问不了类或实例中的任何属性,它已经脱离了类,一般会用在一些工具包中
- 类方法,只能访问类变量,不能访问实例变量
- 属性方法是把一个方法变成一个静态属性
面向对象【day08】:静态方法、类方法、属性方法(九)的更多相关文章
- python静态方法类方法属性方法
Python的静态方法和类成员方法都可以被类或实例访问,两者概念不容易理清,但还是有区别的: 1)静态方法无需传入self参数,类成员方法需传入代表本类的cls参数: 2)从第1条,静态方法是无法访问 ...
- python面向对象(七)属性方法的添加
通常情况下,当我们定义了一个class,创建了一个class的实例后,我们可以给该实例绑定任何属性和方法,这就是动态语言的灵活性.下来我就讲下添加属性和方法,同时也将下限值添加属性方法. 添加属性 ...
- Python面向对象静态方法,类方法,属性方法
Python面向对象静态方法,类方法,属性方法 属性: 公有属性 (属于类,每个类一份) 普通属性 (属于对象,每个对象一份) 私有属性 (属于对象,跟普通属性相似,只是不能通过对象直接访问) 方法: ...
- python 面向对象静态方法、类方法、属性方法、类的特殊成员方法
静态方法:只是名义上归类管理,实际上在静态方法里访问不了类或实例中的任何属性. 在类中方法定义前添加@staticmethod,该方法就与类中的其他(属性,方法)没有关系,不能通过实例化类调用方法使用 ...
- Python的程序结构[1] -> 方法/Method[1] -> 静态方法、类方法和属性方法
静态方法.类方法和属性方法 在 Python 中有三种常用的方法装饰器,可以使普通的类实例方法变成带有特殊功能的方法,分别是静态方法.类方法和属性方法. 静态方法 / Static Method 在 ...
- Python笔记_第四篇_高阶编程_实例化方法、静态方法、类方法和属性方法概念的解析。
1.先叙述静态方法: 我们知道Python调用类的方法的时候都要进行一个实例化的处理.在面向对象中,一把存在静态类,静态方法,动态类.动态方法等乱七八糟的这么一些叫法.其实这些东西看起来抽象,但是很好 ...
- Python面向对象05 /私有成员、类方法、静态方法、属性、isinstance/issubclass
Python面向对象05 /私有成员.类方法.静态方法.属性.isinstance/issubclass 目录 Python面向对象05 /私有成员.类方法.静态方法.属性.isinstance/is ...
- python 面向对象专题(五):私有成员、类方法、静态方法、属性、isinstance/issubclass
https://www.cnblogs.com/liubing8/p/11325421.html 目录 Python面向对象05 /私有成员.类方法.静态方法.属性.isinstance/issubc ...
- python7 静态方法、类方法、属性方法 ;反射;异常处理
#-*- coding:utf8 -*- # 静态方法@staticmethod # 静态方法(当eat变成静态方法后,再通过实例调用时就不会自动把实例本身当作一个参数传给self了.) clas ...
随机推荐
- Scapy的使用
0.前言 最近现场测试项目时,突如其来需要伪造IGMP报文,骗取交换机相关组播流量,慌忙之下学习了Scapy的使用,以及相关快速学习的方法,在这里分享下. 1.Scapy库安装 github地址:ht ...
- 剑指offer:变态跳台阶
题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 思路 首先想到的解决方案是根据普通跳台阶题目改编,因为可以跳任意级,所以要 ...
- Windows10下Docker监控管理工具:Hyper-V管理器
用Hyper-V管理器监控管理Docker,看到最新的MobyLinuxVM了. 今天启动Docker,出现内存不足的问题,调节内存配置即可.
- Java Date Compare
Date a;Date b;假设现在你已经实例化了a和ba.after(b)返回一个boolean,如果a的时间在b之后(不包括等于)返回true b.before(a)返回一个boolean,如果b ...
- [读书笔记]Linux命令行与shell编程读书笔记02 环境变量以及其他
1. Linux的环境变量. 全局环境变量的查看 printenv 一个结果示例 XDG_SESSION_ID=354TERM=xtermSHELL=/bin/bashSSH_CLIENT=10.24 ...
- Node post请求 通常配合ajax
//处理客户post请求//*1:加载相应模块 http express querystring//*2:创建web服务器//*3:监听端口8080const http = require(" ...
- loadrunner基础学习笔记七-面向目标场景
部署应用程序之前,要执行验收测试以确保系统能够承担预期的实际工作量. 可以为想要生成的每秒点击次数,每秒事务数或事务响应时间设置目标 loadrunner将使用面向目标的场景自动生成所需的目标,当应用 ...
- Lodop打印条码二维码的一些设置
Lodop绘制条码图功能让条码打印变得很简单,客户端不用安装专门的条码字库,该函数格式如下:ADD_PRINT_BARCODE(Top,Left,Width,Height,BarCodeType,Ba ...
- 19+ JavaScript 常用的简写技巧
博主说:对于任何基于 JavaScript 的开发人员来说,这绝对是一篇必读的文章,乃提升开发效率之神器也. 正文 js 1. 三元运算符 当你想用一行代码来写if...else语句的时候,使用三元操 ...
- 自学Zabbix之路15.4 Zabbix数据库表结构简单解析-Expressions表、Media表、 Events表
点击返回:自学Zabbix之路 点击返回:自学Zabbix4.0之路 点击返回:自学zabbix集锦 自学Zabbix之路15.4 Zabbix数据库表结构简单解析-Expressions表.Medi ...