四时宝库

程序员的知识宝库

如何理解python中面向对象的类属性和实例属性?

类属性和实例属性

类属性 就是 给 类对象 中定义的 属性

通常用来记录 与这个类相关 的特征

类属性 不会用于记录 具体对象的特征

类属性的理解:

类属性是与类自身相关联的变量,而不是与类的实例关联。它们通常存储在类对象的命名空间内,并且对所有该类的实例共享。

实例属性的理解

实例属性是与特定类的实例(即对象)关联的变量。每个对象都有其独立的一份实例属性副本,也就是说当创建一个类的不同实例时,这些实例可以拥有不同的属性值。

类属性

实例需求

定义一个工具类

每个工具都有自己的name

需求--知道使用这个类,创建了多少个工具对象

代码

class Tool(object):
    #使用赋值语句定义类属性 记录所有工具对象的数量
    count = 0  #类属性
    def __init__(self,name):
        self.name = name

        #每次调用初始化方法 让类属性的值进行 + 1
        Tool.count += 1

#1、创建工具对象
tool = Tool('斧头')
tool = Tool('锤子')
tool = Tool('水桶')
print(tool.count)

上面的代码 ,类中定义了类属性,每次类实例化的时候,都会对类属性+1。

所以创建对象的时候,调用了三次,这就意味着类的实例化了三次,所以最后输出结果为3;

类属性的特点

1、定义和访问:

  • 类属性是在类定义内部直接声明的,无需创建任何实例即可访问。
  • 定义类属性的方式与定义实例属性相似,但类属性是在类作用域内,例如:
class MyClass:
    class_attribute = "这是一个类属性"

# 直接通过类名访问类属性
print(MyClass.class_attribute)

2、共享性:

    • 所有该类的实例都可以访问到这个类属性,而且同一个类的所有实例共享同一份类属性。
    • 如果通过实例修改了类属性,会影响到该类所有其他实例对该属性的访问结果。

3、与实例属性的区别:

    • 实例属性是每个类实例自己独有的,即每个实例可以有自己的属性值,而类属性是所有实例共有的。
    • 实例属性通常在 __init__ 方法或者其他实例方法中初始化,并且绑定到 self 参数(实例本身)上。

4、实例

class Dog:
    species = "Mammal"  # 这是一个类属性

    def __init__(self, name):
        self.name = name  # 这是一个实例属性

# 创建两个Dog实例
dog1 = Dog("Rex")
dog2 = Dog("Bella")

# 访问类属性
print(dog1.species)  # 输出: Mammal
print(dog2.species)  # 输出: Mammal

# 修改类属性,会影响到所有实例
Dog.species = "Canine"
print(dog1.species)  # 输出: Canine
print(dog2.species)  # 输出: Canine

# 类属性与实例属性并存
print(dog1.name)  # 输出: Rex
print(dog2.name)  # 输出: Bella

实例属性的特点

1、定义和绑定:

  • 实例属性通常在类的 __init__ 方法或其他实例方法中定义并初始化。
  • 绑定实例属性的方式是通过使用 self 关键字,self 是指向当前实例的一个引用,在方法内部访问或修改实例属性时会用到它。
class Dog:
    def __init__(self, name, age):
        self.name = name  # 定义并初始化实例属性name
        self.age = age   # 定义并初始化实例属性age

my_dog = Dog("Rex", 3)
print(my_dog.name)  # 输出: Rex

2、内存分配:

每个实例都有自己独立的内存空间来存储实例属性,因此不同实例间的同名属性互不影响。

3、动态性:

  • Python是一种动态类型语言,可以在实例的生命周期内随时添加、修改或删除实例属性,即使在类定义时没有预先声明这些属性。

4、访问控制:

  • 默认情况下,所有实例属性都是公开的,可以直接读取和修改。如果需要控制访问权限,可以使用特殊方法如 __getattr__, __setattr__ 和 __delattr__ 或者通过私有属性(在属性名前加两个下划线 _ _)实现。

#python#

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接