博客
关于我
Python中的类属性、类方法
阅读量:329 次
发布时间:2019-03-04

本文共 2558 字,大约阅读时间需要 8 分钟。

Python中的类属性与方法

在Python中,类是模板,用于创建实例。类属性和实例属性在设计和使用时有显著的区别。本文将详细探讨Python中的类属性以及类属性与实例属性的区别。

类属性的定义与使用

类属性是直接绑定在类上的属性。相比于实例属性,类属性对于所有实例是共享的。以下是一个简单的例子:

class Person(object):    address = 'Earth'  # 类属性定义在类中    def __init__(self, name):        self.name = name  # 实例属性定义在__init__方法中

通过访问Person.address,可以直接获得类属性的值:

print(Person.address)  # 输出: Earth

实例可以访问类属性,但不会修改类属性:

p1 = Person('Bob')p2 = Person('Alice')print(p1.address)   # 输出: Earthprint(p2.address)   # 输出: Earth

类属性是动态的,可以在运行时修改:

Person.address = 'China'  # 修改类属性print(p1.address)        # 输出: Chinaprint(p2.address)        # 输出: China

类属性与实例属性的冲突

当实例属性和类属性名称相同时,实例属性会优先被访问:

class Person(object):    address = 'Earth'    def __init__(self, name):        self.name = namep1 = Person('Bob')print(p1.address)  # 输出: Earth(因为p1没有实例属性address)p1.address = 'China'  # 给p1实例添加实例属性addressprint(p1.address)  # 输出: Chinaprint(Person.address)  # 输出: Earth(类属性未被修改)

删除实例属性后,可以恢复类属性:

del p1.addressprint(p1.address)  # 输出: Earth

Python中的方法也是属性

在Python中,类中的方法实际上是实例属性,指向函数对象:

class Person(object):    def __init__(self, name, score):        self.name = name        self.score = score    def get_grade(self):        return 'A'p1 = Person('Bob', 90)print(p1.get_grade)  # 输出: 
.
at 0x...>print(p1.get_grade()) # 输出: A

方法可以通过装饰器动态绑定到实例:

import typesdef fun_getGrade(self):    if self.score >= 90:        return 'A'    if self.score >= 60:        return 'B'    return 'C'class Person(object):    address = 'Earth'    def __init__(self, name, score):        self.name = name        self.score = score    p1 = types.MethodType(fun_getGrade, Person)    p1.get_grade = types.MethodType(fun_getGrade, p1)print(p1.get_grade())  # 输出: Ap2 = Person('Alice', 80)print(p2.get_grade())  # 输出: AttributeError: 'Person' object has no attribute 'get_grade'

类方法的定义与使用

类方法可以通过装饰器绑定到类:

class Person(object):    count = 0    def __init__(self, name):        self.name = name        Person.count += 1    @classmethod    def num(cls):        return cls.countprint(Person.num())  # 输出: 0p1 = Person('ZYP')print(Person.num())  # 输出: 1p2 = Person('ZYP2')print(Person.num())  # 输出: 2

类方法可以访问类属性,但不能访问实例属性:

class Person(object):    __count = 0    def __init__(self, name):        self.name = name        Person.__count += 1    @classmethod    def num(cls):        return cls.__countprint(Person.num())  # 输出: 0p1 = Person('ZYP')print(Person.num())  # 输出: 1p2 = Person('ZYP2')print(Person.num())  # 输出: 2

总结

类属性和实例属性在Python中有明显的区别。类属性是共享的,而实例属性各自独立。当类属性和实例属性名称冲突时,实例属性优先级高。类方法可以通过装饰器绑定到类,而实例方法则绑定到实例。理解这些概念是掌握Python对象模型的关键。

转载地址:http://jodh.baihongyu.com/

你可能感兴趣的文章
Vue踩坑笔记 - 关于vue静态资源引入的问题
查看>>
Netty工作笔记0025---SocketChannel API
查看>>
Netty工作笔记0027---NIO 网络编程应用--群聊系统2--服务器编写2
查看>>
Netty工作笔记0050---Netty核心模块1
查看>>
Netty工作笔记0060---Tcp长连接和短连接_Http长连接和短连接_UDP长连接和短连接
查看>>
Netty工作笔记0077---handler链调用机制实例4
查看>>
Netty工作笔记0084---通过自定义协议解决粘包拆包问题2
查看>>
Netty常见组件二
查看>>
netty底层源码探究:启动流程;EventLoop中的selector、线程、任务队列;监听处理accept、read事件流程;
查看>>
Netty核心模块组件
查看>>
Netty框架的服务端开发中创建EventLoopGroup对象时线程数量源码解析
查看>>
Netty源码—2.Reactor线程模型一
查看>>
Netty源码—4.客户端接入流程一
查看>>
Netty源码—4.客户端接入流程二
查看>>
Netty源码—5.Pipeline和Handler一
查看>>
Netty源码—6.ByteBuf原理二
查看>>
Netty源码—7.ByteBuf原理三
查看>>
Netty源码—7.ByteBuf原理四
查看>>
Netty源码—8.编解码原理二
查看>>
Netty源码解读
查看>>