python 面向对象之类方法

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

举个例子

class Dog(object):
    def __init__(self, name):
        self.name = name

    @classmethod  # 把eat方法变为类方法
    def eat(self): # 吃东西
        print("%s is eating" % (self.name))


d = Dog("二哈")
d.eat()

执行报错:

AttributeError: type object 'Dog' has no attribute 'name'

意思是:'Dog'类型的对象没有属性名称

不对啊,上面声明了name属性了!为什么呢?

那么引用类变量呢?

class Dog(object):
    n = 'kk' #类变量
    def __init__(self, name):
        self.name = name

    @classmethod  # 把eat方法变为类方法
    def eat(self): # 吃东西
        print("%s is eating" % (self.n))


d = Dog("二哈")
d.eat()

执行输出:

kk is eating

引用类变量,发现没有报错。

再将n改到实例变量呢?

class Dog(object):
    def __init__(self, name):
        self.name = name
        self.n = 'kk' #实例变量

    @classmethod  # 把eat方法变为类方法
    def eat(self): # 吃东西
        print("%s is eating" % (self.n))


d = Dog("二哈")
d.eat()

执行报错:

AttributeError: type object 'Dog' has no attribute 'n'

总结:

类方法只能访问类变量,不能访问实例变量

比如说实例和类,有同样的变量,它需要强制访问类变量的时候

就可以用到类方法了。

我们要写一个只在类中运行而不在实例中运行的方法. 如果我们想让方法不在实例中运行,可以使用类方法。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏黑泽君的专栏

java.lang.ClassCastException(java强制类型转换异常)

ClassCastException,从字面上看,是类抛出异常,即是类型转换错误,通常是进行强制类型转换时候出的错误。如下图所示:

4.4K20
来自专栏Danny的专栏

【J2SE快速进阶】——向上转型及其内存分析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huyuyang6688/article/...

9310
来自专栏Java进阶之路

java中hashCode和equals的使用

16200
来自专栏mukekeheart的iOS之旅

Java 内部类种类及使用解析

  Java 内部类种类及使用解析 内部类Inner Class   将相关的类组织在一起,从而降低了命名空间的混乱。   一个内部类可以定义在另一个类里,可以...

25250
来自专栏xingoo, 一个梦想做发明家的程序员

JS面向对象高级特性

本篇是通过学习视频《一头扎进javascirpt高级篇》整理的一些相关知识,大致包括下面几个方面:   1 对象的创建方法   2 对象的对象属性、私有属...

246100
来自专栏LanceToBigData

JavaSE(五)JAVA对象向上转型和向下转型

今天做了一个测试的题目,发现自己还是很多问题没有静下心来做。很多问题是可以自己解决的但是自己一是没有读清题意,二是自己心里太急躁了。所以这个要自己应以为鉴!  ...

23460
来自专栏JetpropelledSnake

Python入门之面向对象编程(二)python类的详解

本文通过创建几个类来覆盖python中类的基础知识,主要有如下几个类 Animal :各种属性、方法以及属性的修改 Dog :将方法转化为属性并操作的方法 Ca...

32290
来自专栏青玉伏案

窥探Swift之别样的枚举类型

  想必写过程序的童鞋对枚举类型并不陌生吧,使用枚举类型的好处是多多的,在这儿就不做过多的赘述了。Fundation框架和UIKit中的枚举更是数不胜数,枚举可...

21170
来自专栏精讲JAVA

详解 equals() 方法和 hashCode() 方法

Java的基类Object提供了一些方法,其中equals()方法用于判断两个对象是否相等,hashCode()方法用于计算对象的哈希码。equals()和ha...

12430
来自专栏JavaEdge

SpringBoot2.0响应式编程系列(二)-函数式编程和lambda表达式函数接口方法引用类型推断

56530

扫码关注云+社区

领取腾讯云代金券