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

本文共 2623 字,大约阅读时间需要 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) # 输出: Earth
print(p2.address) # 输出: Earth

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

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

类属性与实例属性的冲突

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

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

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

del p1.address
print(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 types
def 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()) # 输出: A
p2 = 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.count
print(Person.num()) # 输出: 0
p1 = Person('ZYP')
print(Person.num()) # 输出: 1
p2 = 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.__count
print(Person.num()) # 输出: 0
p1 = Person('ZYP')
print(Person.num()) # 输出: 1
p2 = Person('ZYP2')
print(Person.num()) # 输出: 2

总结

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

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

你可能感兴趣的文章
Nginx 中解决跨域问题
查看>>
nginx 代理解决跨域
查看>>
Nginx 动静分离与负载均衡的实现
查看>>
Nginx 反向代理 MinIO 及 ruoyi-vue-pro 配置 MinIO 详解
查看>>
nginx 反向代理 转发请求时,有时好有时没反应,产生原因及解决
查看>>
Nginx 反向代理解决跨域问题
查看>>
Nginx 反向代理配置去除前缀
查看>>
nginx 后端获取真实ip
查看>>
Nginx 多端口配置和访问异常问题的排查与优化
查看>>
Nginx 如何代理转发传递真实 ip 地址?
查看>>
Nginx 学习总结(16)—— 动静分离、压缩、缓存、黑白名单、性能等内容温习
查看>>
Nginx 学习总结(17)—— 8 个免费开源 Nginx 管理系统,轻松管理 Nginx 站点配置
查看>>
Nginx 学习(一):Nginx 下载和启动
查看>>
nginx 常用指令配置总结
查看>>
Nginx 常用配置清单
查看>>
nginx 常用配置记录
查看>>
nginx 开启ssl模块 [emerg] the “ssl“ parameter requires ngx_http_ssl_module in /usr/local/nginx
查看>>
Nginx 我们必须知道的那些事
查看>>
Nginx 的 proxy_pass 使用简介
查看>>
Nginx 的配置文件中的 keepalive 介绍
查看>>