Python 静态方法、类方法和属性方法

静态方法(staticmethod)

staticmethod不与类或者对象绑定,类和实例对象都可以调用,没有自动传值效果,Python内置函数staticmethod将类中的函数定义成静态方法(特点:定义在类命名空间,与类无直接关系,不能访问实例变量或类变量)。

应用场景:编写类时需要采用不同的方式来创建实例,但是__init__()只有一个,此时静态方法就可以派上用场:

import time

class Date:
def __init__(self, year, month, day):
self.year = year
self.month = month
self.day = day @staticmethod
def now(): # 用Date.now()的形式去产生实例,该实例用的是当前时间
t = time.localtime() # 获取结构化时间格式
return Date(t.tm_year, t.tm_mon, t.tm_mday) # 新建实例并返回 @staticmethod
def tomorrow(): # 用Date.tomorrow()的形式去产生实例,该实例用的是明天的时间
t = time.localtime(time.time() + 86400)
return Date(t.tm_year, t.tm_mon, t.tm_mday) a = Date(2018, 5, 13) # 自定义时间
b = Date.now() # 采用当前时间
c = Date.tomorrow() # 采用明天的时间 print(a.year, a.month, a.day) # 2018 5 13
print(b.year, b.month, b.day) # 2018 5 13
print(c.year, c.month, c.day) # 2018 5 14

类方法(classmethod)

classmethod是给类用的,即绑定到类,类在使用时会将类本身当作参数传给类方法的第一个参数(即便是对象来调用也会将类当作第一个参数传入),类和实例都可以调用(特点:方法的第一个参数是类对象而不是实例对象,只能访问类变量,不能访问实例变量);Python内置函数classmethod将类中的方法定义成类方法。

应用场景:

import time

class Date:
def __init__(self, year, month, day):
self.year = year
self.month = month
self.day = day # @staticmethod
# def now(): # 用Date.now()的形式去产生实例,该实例用的是当前时间
# t = time.localtime() # 获取结构化时间格式
# return Date(t.tm_year, t.tm_mon, t.tm_mday) # 新建实例并返回 # @staticmethod
# def tomorrow(): # 用Date.tomorrow()的形式去产生实例,该实例用的是明天的时间
# t = time.localtime(time.time() + 86400)
# return Date(t.tm_year, t.tm_mon, t.tm_mday)
@classmethod
def now(cls):
t = time.localtime()
return cls(t.tm_year, t.tm_mon, t.tm_mday) # 哪个类调用,即用哪个类cls来实例化 class EuroDate(Date):
def __str__(self):
return "year: %s month: %s day: %s" % (self.year, self.month, self.day) euro = EuroDate.now()
print(euro) # year: 2018 month: 5 day: 13

注意:静态方法和类方法虽然是类里面的,但是如果实例使用也是可以的。只不过实例调用时容易让人混淆,不知道要干啥

属性方法(property)

property作用就是把一个方法变成静态属性,如下实例:

class Dog(object):

    def __init__(self,name):
self.name = name @property
def eat(self):
print(" %s is eating" %self.name) d = Dog("Golden")
d.eat()

运行程序结果如下:

Traceback (most recent call last):
Golden is eating
File "D:/PythonCode/oop directory/middle rank.py", line 44, in <module>
d.eat()
TypeError: 'NoneType' object is not callable

根据错误我们可以发现,此时eat已经变成静态属性了,不是方法,所以不能通过加()的方式进行调用,直接d.eat访问其属性就可,如下所示:

d = Dog("Golden")
d.eat # Golden is eating

为甚要使用property

将一个类的函数定义成静态属性之后,对象再去使用的时候直接使用obj.attribute,根本无法察觉自己的attribute是执行了一个函数之后得到的,这种特性的使用遵循了统一访问的原则

如果我们想要修改和删除该property生成的静态变量只能使用下面的方式:

class Foo:
def __init__(self, val):
self.__name = val @property
def name(self):
return self.__name @name.setter # 修改
def name(self, value):
if not isinstance(value, str):
raise TypeError("%s must be str" % value)
self.__name = value @name.deleter # 删除
def name(self):
print("name removed...")
# raise TypeError("can not delete") f = Foo("Husky")
print(f.name)
f.name = "Golden"
print(f.name)
del f.name

Python 静态方法、类方法和属性方法的更多相关文章

  1. Python面向对象静态方法,类方法,属性方法

    Python面向对象静态方法,类方法,属性方法 属性: 公有属性 (属于类,每个类一份) 普通属性 (属于对象,每个对象一份) 私有属性 (属于对象,跟普通属性相似,只是不能通过对象直接访问) 方法: ...

  2. 【面试必问】python实例方法、类方法@classmethod、静态方法@staticmethod和属性方法@property区别

    [面试必问]python实例方法.类方法@classmethod.静态方法@staticmethod和属性方法@property区别 1.#类方法@classmethod,只能访问类变量,不能访问实例 ...

  3. python中静态方法、类方法、属性方法区别

    在python中,静态方法.类方法.属性方法,刚接触对于它们之间的区别确实让人疑惑. 类方法(@classmethod) 是一个函数修饰符,表是该函数是一个类方法 类方法第一个参数是cls,而实例方法 ...

  4. Python的程序结构[1] -> 方法/Method[1] -> 静态方法、类方法和属性方法

    静态方法.类方法和属性方法 在 Python 中有三种常用的方法装饰器,可以使普通的类实例方法变成带有特殊功能的方法,分别是静态方法.类方法和属性方法. 静态方法 / Static Method 在 ...

  5. python静态方法类方法属性方法

    Python的静态方法和类成员方法都可以被类或实例访问,两者概念不容易理清,但还是有区别的: 1)静态方法无需传入self参数,类成员方法需传入代表本类的cls参数: 2)从第1条,静态方法是无法访问 ...

  6. Python笔记_第四篇_高阶编程_实例化方法、静态方法、类方法和属性方法概念的解析。

    1.先叙述静态方法: 我们知道Python调用类的方法的时候都要进行一个实例化的处理.在面向对象中,一把存在静态类,静态方法,动态类.动态方法等乱七八糟的这么一些叫法.其实这些东西看起来抽象,但是很好 ...

  7. python 面向对象静态方法、类方法、属性方法、类的特殊成员方法

    静态方法:只是名义上归类管理,实际上在静态方法里访问不了类或实例中的任何属性. 在类中方法定义前添加@staticmethod,该方法就与类中的其他(属性,方法)没有关系,不能通过实例化类调用方法使用 ...

  8. Python 静态方法,类方法,属性方法

    方法的使用 静态方法 - 只是名义上归类管理,实际上在静态方法里访问不了类或实例中的任何属性. class Dog(object): def __init__(self,name): self.nam ...

  9. python第三十三天----静态方法、类方法、属性方法

    @staticmethod 装饰后,类中的方法转成静态方法 class a: @staticmethod def b(self): print('') 静态方法不可以访问实例变量或类变量,相当于类中的 ...

随机推荐

  1. CLR via c#读书笔记九:接口

    1.接口对一组方法签名进行了统一命名.接口还能定义事件.无参属性和有参属性(C#的索引器). 2.c#禁止接口定义任何一种静态成员. 3.C#编译器要求将实现接口的方法标记为public.CLR要求将 ...

  2. Nginx+Tomcat多站点访问默认主页问题-狒狒完美解决-Q9715234

    <Engine name="Catalina" defaultHost="www.abc.com"> <Host name="www ...

  3. 根据wsdl生成服务端代码

    场景描述 最近在和一家公司做业务接口对接,由他们那边回调我们这边,对方直接扔过来一个webservice的wsdl文件,让我们按照他们的规范来做webservice服务, 大多数的对接应该是我们创建完 ...

  4. VIN码识别/车牌识别:是入口,是门面

    汽车后市场高速发展下,汽车用品.零配件及售后服务已经从实体店延伸至线上,无论是整车厂.4S店.传统的汽修店,还是汽配商,都渴望用更合理的.高效的方式,实现运营管理上的突破. 广州云实信息科技有限公司( ...

  5. Selenium(Python) ddt数据驱动

    首先, 添加ddt模块: import unittestfrom time import sleep from ddt import ddt, data, unpack# 导入ddt模块from se ...

  6. APP功能性测试-2

    安装与卸载 应用是否可以在不同的安卓版本上安装(过低不能适配) 安装后是否可以正常运行 安装空间不足时是否有相应提示 如果应用需要通过网络验证之类的安装,需要测试一下断网情况下是否有相应提示 安装过程 ...

  7. Linux命令应用大词典-第43章iptables和arptables防火墙

    43.1 iptables-save:保存iptables规则 43.2 iptables-restore:恢复iptables规则 43.3 iptables:IPv4数据包过滤和NAT管理工具 4 ...

  8. react创建新项目并且修改配置文件

    react创建项目 这是我在用react搭建项目时,用到的一些东西,顺序纯属自己定义, 一.创建项目 用react 创建一个项目,这也是官方给出的 1.npm install create-react ...

  9. Python3 Tkinter-Checkbutton

    1.多选按钮创建 from tkinter import * root=Tk() Checkbutton(root,text='python').pack() root.mainloop() 2.绑定 ...

  10. Ext JS 6学习文档-第8章-主题和响应式设计

    Ext JS 6学习文档-第8章-主题和响应式设计 主题和响应式设计 本章重点在 ExtJS 应用的主题和响应式设计.主要有以下几点内容: SASS 介绍和入门 主题 响应式设计 SASS 介绍和入门 ...