Python_静态属性、类方法、静态方法

1.静态属性
我们知道类既有函数属性又有数据属性,实例只有数据属性,我们在使用实例调用类的函数属性并运行时,总要带上函数后面的括号才能运行,不然总是调用函数的内存地址,如下图所示:

问题:那么我们如何能像调用数据属性一样调用函数属性呢?

类中提供了@property关键字,可以看成@property是一个装饰器,装饰器的作用是调用类的函数属性key值时,直接来运行该key值对应的函数。像是调用类的属性一样来直接调用并运行类的函数,具体操作如:
1.1加上@property关键字后,类的函数属性的不同之处:

1.2加上@property关键字后,实例调用类的函数属性:

注意,当类中的函数有其他参数时(非self),加上@property关键字会报错,提示缺少必要的位置参数,猜想应该是装饰的问题,可能需要自定义装饰器才行。可以判断,@property的作用是:直接运行被装饰的函数,不能带参数,表面上看就是在被装饰的函数后面直接加括号。
该部分的代码块为:

import time
class Door():
    "门的类"
    address = "浙江省杭州市"
    def __init__(self,size,color,type):#构造函数
        "初始化门的数据"
        self.size = size
        self.color = color
        self.type = type
    @property
    def open(self):
        "门打开的方法"
        print("这个%s门打开了" %self.type)
    @property
    def off(self,time):
        "门关闭的方法"
        print("这个%s门关闭了,时间为;%s" %(self.type,time))
door1 = Door(16, ‘red‘, ‘木门‘)
#调用数据属性
print(door1.size)
print(door1.address)
#调用函数属性
# door1.open()    #函数后面的括号每次都必须要带上
#实例调用类的静态属性
print(Door.__dict__)
door1.open
time1 = time.strftime(‘%Y-%m-%d %H:%M:%S‘,time.localtime())
# door1.off(time1)    #传参无效,应该要自定义对应的装饰器才行

2.类方法
如果要求,不进行实例化,直接调用类的函数,此时会提示缺少必要的位置参数self,如下图:

我们加上位置参数后,如下图:

虽然我们可以随意加上位置参数,但是注意到此处的self有特殊含义,它是指实例的本身,也就是说要使用self必须要先实例化才行。为了解决这个问题,我们引入另一个@classmethod装饰器后,就可以直接通过类来调用类的函数属性了(该函数带类的数据属性参数),如下图所示:

3.静态方法
如果要求:在类中定义一个函数,要求该函数中的位置函数与实例无关,与所在的类本身也无关。为了解决该问题,现引入了@staticmethod,操作如下图所示:

可以看出,虽然test方法与实例无关,与类本身也无关,但是却可以通过实例和类来调用它,却使用实例调用它是不会传入实例本身的位置参数(在正常类方法中,实例化类后,实例在调用它时,会自动默认首先传入实例本身即self)。
到了此处可能有人问,为什么不能直接在类中定义一个函数,不传self形参?按照上面的提议是否能满足实例可以调用,类本身也可以调用的要求呢?详见下图:

我们可以看出,如果直接在类中定义一个常规方法(不含self的形参),通过类本身访问它,但是通过实例来访问它时虽然也是传入2个参数,但是实际行python自动默认首位传入了self,这样就造成了上面的情况了(传的是2个参数,收到的是3个参数)
该部分代码块如下:

class Door():
    "门的类"
    address = "浙江省杭州市"
    def __init__(self,size,color,type):#构造函数
        "初始化门的数据"
        self.size = size
        self.color = color
        self.type = type
    def open(self):
        "门打开的方法"
        print("这个%s门打开了" %self.type)
    def off(self,time):
        "门关闭的方法"
        print("这个%s门关闭了,时间为;%s" %(self.type,time))
    @staticmethod
    def test(x,y):
        print("%s,%s的乘积为:%s"%(x,y,x*y))

    def test1(x,y):
        print("%s,%s的乘积为:%s"%(x,y,x*y))

door1 = Door(16, ‘red‘, ‘木门‘)
#调用静态方法test
Door.test(1,3)
door1.test(2,5)
#调用常规方法test1
Door.test1(1,3)
door1.test1(2,5)

注意:静态方法中不能调类属性和方法,也不能调用实例变量,只是类的工具包。因为没有self,也就不能指类本身或实例本身,从而不能调用相应的类属性和类方法。

原文地址:http://blog.51cto.com/10836356/2108790

时间: 2024-11-06 16:40:26

Python_静态属性、类方法、静态方法的相关文章

python的类的 静态属性 类方法 静态方法

一.静态属性 静态属性说的就是数据属性 1.定义一个房间的类,求下这个房间的面积 class Room: def __init__(self,name,ower,width,length,heigh): self.Name=name self.Ower=ower self.Width=width self.Length=length self.Heigh=heigh r1=Room("厕所","北爷",2,2,20000)#实例化出来一个实例r1,实例化的过程就是执

PHP中的抽象类与抽象方法/静态属性和静态方法/PHP中的单利模式(单态模式)/串行化与反串行化(序列化与反序列化)/约束类型/魔术方法小结

  前  言  OOP  学习了好久的PHP,今天来总结一下PHP中的抽象类与抽象方法/静态属性和静态方法/PHP中的单利模式(单态模式)/串行化与反串行化(序列化与反序列化). 1  PHP中的抽象类与抽象方法 1.什么是抽象方法?              没有方法体 {} 的方法,必须使用abstract 关键字修饰.这样的方,我们叫做抽象方法.                    abstract function say(); //    抽象方法 2.什么是抽象类?        

类和对象:静态属性、静态方法

在PHP中,使用关键字 static 修饰成员属性和成员方法被称为静态属性和静态方法.静态属性和静态方法不需要在类被实例化的情况下可以直接使用. 静态属性 与普通的成员属性不同,静态属性属于类本身而不属于类的任何实例.静态属性可以被看做是存储在类当中的全局变量,可以在任何地方通过类来访问它们. 由于静态属性不受任何具体对象的限制,所以不需要建立类实例,而可以直接引用类中的静态属性,使用语法格式如下: 类名称::$静态属性名称 其中,符号”::”被称作范围解析操作符,它可以用于访问静态成员.静态方

php静态属性和静态方法学习笔记

在属性和方法前加static修饰可以成为静态属性和静态方法. 静态属性的访问用 类来访问  例如  human::$head 1.类生成完毕,静态属性就已经存在,不需要依赖对象来访问 2.类在内存中只有一个,因此静态属性也只有一个. 普通方法,存放于类内,只有一份 静态方法,也是存放于类内,只有一份. 区别在于,普通方法需要用队形去调动,需要绑定$this,必须要有对象,用对象调动. 而静态方法,不属于哪个对象,属于类,因此不需要用$this去绑定,同过类名就可以调用.

php静态属性和静态方法

php静态属性和静态方法 2012-09-29 10:18 1518人阅读 评论(0) 收藏 举报 phpfunction 本php教程主要是学习php中静态属性和静态方法的使用方法和基本的示例. ·                                 静态属性 静态属性也就是说它的值保持其值,比如在类中实例化了N个对象,那么你可以在构造函数中定义一个静态属性来记住对象的个数.类中的静态属性和静态变量差不多,只不过在类中似乎又多了一个些使用上的限制罢了.让我们看看一般的变量吧: <?

c++第七章-(静态属性和静态方法)

1.静态属性和静态方法 静态方法的调用,ClassName::mothodName(); class Pet { public: Pet(std::string theName); ~Pet(); static int getCount();//公开的静态方法 protected: std::string name; private: static int count;//私有的静态变量 }; class Dog:public Pet { public: Dog(std::string theN

Java静态属性、静态方法、非静态属性、非静态方法的继承问题简单了解

package com.book.web.controller; /**  * 父类  * @author liweihan  *  */ public class Parent { public String normalStr = "父类非静态属性"; public static String staticStr = "父类静态属性"; public String changeStr = "父类-变量"; public static Stri

php之静态属性与静态方法

静态属性用法:static public $var = 1; 从内存角度看,静态属性存放在类内,普通属性存放在对象中,类声明完毕,静态属性就存在,因为类在内存中只有一个,静态也只有一个. 普通属性存放在对象中,用对象->$var来访问,静态属性存放在类内,不依赖对象,没有对象也能访问,用类名::$var来访问,静态属性只有一个,为所有对象共享. 静态方法用法:static public function t(){} 普通方法存放在类内,只有一份,静态方法也存放在类内,也只有一份.区别在于,普通方

static静态属性和静态方法的原理与调用技巧

这篇文章主要介绍了php面向对象中static静态属性和静态方法的调用,实例分析了static静态属性和静态方法的原理与调用技巧,需要的朋友可以参考下 本文实例讲述了php中static静态属性和静态方法的调用.分享给大家供大家参考.具体如下: 这里分析了php面向对象中static静态属性和静态方法的调用.关于它们的调用(能不能调用,怎么样调用),需要弄明白了他们在内存中存放位置,这样就非常容易理解了.静态属性.方法(包括静态与非静态)在内存中,只有一个位置(而非静态属性,有多少实例化对象,就