概述
类属性与类方法
类属性
顾名思义,就是属于“类”的属性。我们之前在类中定义的属性都是属于“对象“的,随着对象的创建而创建,随着对象的销毁而销毁。并且不同的对象是互不干扰的。但是类属性不然,类属性是属于类的,随着类的定义加载到静态池中,被所有的对象所共享!
类属性与对象属性的区别:
- 开辟时机不同:
- 对象属性是随着对象的实例化而开辟在堆中的,随着对象的销毁而销毁的。
- 类属性是随着类的定义被开辟在静态池中的。
- 所属主体不同:
- 对象属性是属于对象的,不同的对象的属性彼此独立,互不影响。
- 类属性是被所有的对象共享的。
# @Author
: 大数据章鱼哥
# @Company
: 北京千锋互联科技有限公司
class Person:
# 直接在类内写的属性,就是类属性
# 这个属性,被所有的对象共享
# 不可变的数据类型
count = 0
# 可变的数据类型
friends = []
# 创建类的对象
p1 = Person()
print(id(p1.count))
p2 = Person()
print(id(p2.count))
# 尝试使用对象来修改类属性(不可变的类型)
# p1.count = 10
# print(id(p1.count))
# 其实是对p1开辟了一个新的空间,修改了p1.count的地址指向
# print(id(p2.count))
p1.friends.append('zhangsan')
# 其实这里并没有对属性进行修改,存储的依然是指向一个数据容器内存空间的地址
print(id(p1.friends), p1.friends)
print(id(p2.friends), p2.friends)
# 正确的类属性访问方式:使用类来访问
Person.count = 20
print(p1.count, p2.count)
2. 类方法
类方法就是“属于类”的方法,在定义的时候需要使用**@classmethod**来修饰,同时必须要有一个特殊的参数cls。调用方法的时候,可以使用类来调用,也可以使用对象来调用。但是更加推荐使用类来调用。
需要注意:在类方法中,由于没有对象传入,因此无法直接访问到当前类的对象属性,只能够访问到类属性。
class Person:
# 定义类属性
__count = 0
def __init__(self, name, age):
self.name = name
self.age = age
@classmethod
def count_of_person(cls):
"""
类方法使用 @classmethod 修饰
在调用的时候,cls表示调用的类,注意不是对象!
:return:
"""
print(Person.__count)
# 可以访问到类属性
# print(Person.name)
# 因为没有对象传入,因此无法直接访问到对象的属性
# 使用类来调用,Python解释器会自动的将Person类传递给参数cls
Person.count_of_person()
# 使用对象来调用,Python解释器会自动的将对象所对应的类传递给参数cls【不推荐】
x = Person("xiaoming", 12)
x.count_of_person()
3. 静态方法
静态方法也是属于类的方法,与类方法类似,但是在定义和使用的时候与类方法还是有点区别的:
- 使用 @staticmethod 装饰器来修饰
- 不需要特殊的参数,例如cls、self等
class Person:
# 定义类属性
__count = 0
def __init__(self, name, age):
self.name = name
self.age = age
@staticmethod
def count_of_person():
"""
静态方法使用 @staticmethod 修饰
:return:
"""
print(Person.__count)
# 可以访问到类属性
# print(Person.name)
# 因为没有对象传入,因此无法直接访问到对象的属性
# 使用类来调用
Person.count_of_person()
# 使用对象来调用
x = Person("xiaoming", 12)
x.count_of_person()
静态方法常见于工具类的封装
class Tool:
@staticmethod
def get_sum(*args, **kwargs):
# 将所有的数字合并到一个元组中
data = args + tuple(kwargs.values())
# 定义变量,用来记录累加的结果
res = 0
# 累加
for ele in data:
res += ele
return res
@staticmethod
def is_prime_number(number):
if number < 2:
return False
for i in range(2, (number // 2) + 1):
if number % i == 0:
return False
return True
# 工具类的使用
print(Tool.get_sum(99, 100, 98, chinese=99, math=89, english=100, mysql=90, python=90))
print(Tool.is_prime_number(99))
最后
以上就是无情豌豆为你收集整理的第六章 Python面向对象 05-类属性与类方法类属性与类方法的全部内容,希望文章能够帮你解决第六章 Python面向对象 05-类属性与类方法类属性与类方法所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复