Python-面向对象高级语法之静态方法、类方法

静态方法

一、什么是静态方法

  普通的方法可以在实例化后直接调用,并且在方法里可以通过self.xxx调用实例变量或类变量,而静态方法是不可以访问实例变量或类变量,一个不能访问实例变量和类变量的方法,实际上已经和类本身没什么关系了。唯一与类有关联的就是有需要通过类名来调用这个方法。

二、如何使用静态方法

  通过@staticmethod装饰器把需其装饰的方法即可变成一个静态方法。

# _*_ coding:utf-8 _*_

class Dog(object):

    def __init__(self, name):
        self.name = name

    @staticmethod   # 属于类的一种方法,但无法访问类或实例的属性
    def eat(self, food):
        print("%s is eating %s" % (self.name, food))

    def talk(self):
        print("%s is talking." % self.name)

dog = Dog("Tom")

# 当eat变成静态方法后,再通过实例调用时就不会自动把实例本身当作一个参数传给self
dog.eat("Apple")
# TypeError: eat() missing 1 required positional argument: ‘food‘

# 正确的姿势
dog.eat(dog, "Apple")

再看看这个例子:
class Dog(object):
    name = "JACK"
    def __init__(self, name):
        self.name = name

    @staticmethod
    def eat(name, food):
        print("%s is eating %s" % (name, food))

    def talk(self):
        print("%s is talking." % self.name)

dog = Dog("Tom")
# 当作普通方法使用,传入位置参数
dog.eat("Jack", "Apple")

# 直接通过类名调用
Dog.eat("Jerry", "HotDog")

类方法

  类方法通过@classmethod装饰器实现,类方法和普通方法的区别是, 类方法只能访问类变量,不能访问实例变量。

class Dog(object):

    def __init__(self, name):
        self.name = name

    def eat(self, food):
        print("%s is eating %s" %(self.name, food))

    @classmethod
    def talk(self):
        print("%s is talking." % self.name)

dog = Dog("Tom")
dog.eat(‘apple‘)
dog.talk()    # 此时调用会报错,提示没有name这个属性。

再来看下面的代码:
class Dog(object):
    name = "Jack"
    def __init__(self, name):
        self.name = name

    def eat(self, food):
        print("%s is eating %s" %(self.name, food))

    @classmethod
    def talk(self):
        print("%s is talking." % self.name)

dog = Dog("Tom")    # 实例化一只叫Tom的狗
dog.talk()
Jack is talking.    # 结果却是Jack
时间: 2024-10-13 16:21:03

Python-面向对象高级语法之静态方法、类方法的相关文章

python面向对象之静态属性/静态方法/类方法/组合

#!/usr/bin/env python # coding:utf-8 class Campus: def __init__(self,name,addr,type): self.Name = name self.Addr = addr self.Type = type def details(self): print("学样的详细信息, 名称:%s 地址:%s 类型:%s" %(self.Name,self.Addr,self.Type) ) c1 = Campus("南

Day7 - 面向对象高级语法

参考文章:http://www.cnblogs.com/alex3714/articles/5213184.html 本节内容: 面向对象高级语法部分 静态方法.类方法.属性方法 类的特殊成员方法 反射 静态方法                                                                                   通过 @staticmethod 装饰器即可把其装饰的方法变为一个静态方法,什么是静态方法呢?其实不难理解,普通的方法,可

Python自动化 【第七篇】:Python基础-面向对象高级语法、异常处理、Scoket开发基础

本节内容: 1.     面向对象高级语法部分 1.1   静态方法.类方法.属性方法 1.2   类的特殊方法 1.3   反射 2.     异常处理 3.     Socket开发基础 1.     面向对象高级语法部分 1.1   静态方法.类方法.属性方法 1)   静态方法 通过@staticmethod装饰器即可把其装饰的方法变为一个静态方法.普通的方法,可以在实例化后直接调用,并且在方法里可以通过self.调用实例变量或类变量,但静态方法是不可以访问实例变量或类变量的,一个不能访

Python之路【第十二篇】:Python面向对象高级

一.反射 1 什么是反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它首先被程序语言的设计领域所采用,并在Lisp和面向对象方面取得了成绩. 2 python面向对象中的反射:通过字符串的形式操作对象相关的属性.python中的一切事物都是对象(都可以使用反射) 四个可以实现自省的函数 下列方法适用于类和对象(一切皆对象,类本身也是一个对象) 导入其他模块,利用反

python面向对象-3类的静态方法和类方法

还是以上次的洗衣机例子: 1 class Washer: 2 company='ZBL' 3 def __init__(self,water=10,scour=2): 4 self._water=water #不想让用户直接访问实例变量,可以标志成私有 5 self.scour=scour 6 self.year=2000#这是生产日期 7 #属性包装,将water属性包装成方法,用户使用water时实际是访问的方法 8 @staticmethod #定义一个静态方法 9 def spins_m

python 类高级语法 静态方法

通过@staticmethod装饰器即可把其装饰的方法变为一个静态方法,什么是静态方法呢?其实不难理解,普通的方法,可以在实例化后直接调用,并且在方法里可以通过self.调用实例变量或类变量,但静态方法是不可以访问实例变量或类变量的,一个不能访问实例变量和类变量的方法,其实相当于跟类本身已经没什么关系了,它与类唯一的关联就是需要通过类名来调用这个方法 class dog(object): def __init__(self,name): self.name = name @staticmetho

Python面向对象高级编程:@property--把方法变为属性

为了限制score的范围,可以通过一个set_score()方法来设置成绩,再通过一个get_score()来获取成绩,这样,在set_score()方法里,就可以检查参数: 1 >>> class Student(object): 2 def get_score(self): 3 return self.__score 4 def set_score(self,value): 5 if not isinstance(value,int): 6 raise ValueError('sec

python面向对象高级编程

python中属性和方法的动态绑定  class Student(object):     pass   # 实例化一个对象     s = Student() # 给这个对象绑定一个属性name s.name = 'John'   print(s.name) John   # 定义一个方法 def set_age(self, age):     self.age = age   # 导入模块     from types import MethodType   #给s这个对象绑定一个set_a

python\面向对象高级

一.__slots__ 1.__slots__的概念:是一个变量,变量值可以是列表,元组,或者可迭代对象,也可以是一个字符串. 2.使用点来访问属性本质就是在访问类或者对象的__dict__属性字典(类的字典是共享的,而每个实例是独立的) 3.为什么要用:节省内存,不会产生新的名称空间. 定义__slots__后,__slots__就会为实例使用一种更加紧凑的内部表示.实例通过一个很小的固定大小的数组来构建,而不是每个实例定义一个字典:在__slots__中列出的属性名在内部被映射到这个数组的指