Python进阶(4)–类属性

◎知识点

  1. 绑定类属性的方式

  2. 访问类属性的方式


◎脚本练习

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
 @FileName:    class_attributes.py
 @Function:    python类属性
 @Author:      Zhihe An
 @Site:        https://chegva.com
 @Time:        2021/7/12
"""


"""类属性"""

"""
类属性指的是类对象所绑定的属性

绑定类属性(给类对象绑定属性)的方式有两种:
1. 在类对象的内部(方法外)
    语法格式:属性名 = 属性值
2. 在类对象的外部
    python是动态语言,所以,在类对象创建之后,可以对其动态地绑定属性
    语法格式:类对象.属性名 = 属性值
    如果指定名称的类属性已经存在,则是对类属性进行修改
    
访问类属性的方式有两种:
1. 在类对象的内部(方法中)
    语法格式:类对象.属性名
2. 在类对象的外部
    语法格式:类对象.属性名 或:实例对象.属性名
    类对象的所有实例对象都有一个指向类对象的指针,所以,类对象的所有实例对象都可以访问类属性
    
    之所以添加前缀"类对象",是为了表明类属性被哪个类对象所绑定
"""

class MyClass(object):
    # 在类对象的内部(方法外)绑定类属性
    ca1 = 18

    def do_sth(self):
        # 在类对象的内部(方法中)访问类属性
        print(MyClass.ca1)

    def do_another(self):
        # 在类对象的内部(方法中)访问类属性
        print(MyClass.ca2)

mc = MyClass()

# 在类对象的外部调用方法,使得在类对象的内部(方法中)访问类属性
mc.do_sth() # 18

# 在类对象的外部通过类对象访问类属性
print(MyClass.ca1)  # 18
# 在类对象的外部通过实例对象访问类属性
print(mc.ca1)       # 18

# 在类对象的外部绑定类属性
MyClass.ca2 = 56
# 在类对象的外部通过类对象访问类属性
print(MyClass.ca2)  # 56
# 在类对象的外部通过实例对象访问类属性
print(mc.ca2)       # 56
# 在类对象的外部修改绑定的类属性值
MyClass.ca2 = 73
print(MyClass.ca2)  # 73
print(mc.ca2)       # 73

# 在类对象的外部调用方法,使得在类对象的内部访问类属性
mc.do_another()     # 73

"""
    访问实例属性和类属性都可以通过"实例对象.属性名"的方式。当通过"实例对象.属性名"的方式
    访问属性时,会先查找指定的实例对象中有没有指定名称的实例属性,如果没有,再查找对应的类对象中
    有没有指定名称的类属性。所以,当通过"实例对象.属性名"的方式访问属性时,如果实例属性和类属性同名,
    实例属性会屏蔽掉类属性
    当通过"实例对象.属性名 = 属性值"的方式绑定属性时,这里的属性只表示实例属性(因为类属性没有
    这样的绑定方式),所以,只会查找指定的实例对象有没有绑定指定名称的实例属性,如果没有则进行绑定,
    如果已经绑定了,则对属性值进行修改
"""

class Person(object):
    age = 18

p = Person()

# 在实例对象p中没有找到名为age的实例属性,然后在类对象Person中找到了名为age的类属性
print(p.age)    # 18
# 打印名为age的类属性
print(Person.age)   # 18

# 给实例对象p绑定实例属性
p.age = 19
# 实例属性屏蔽掉了同名的类属性
print(p.age)    # 19
# 打印名为age的类发展
print(Person.age) # 18

# 删除实例对象p绑定的实例属性
del p.age
print(p.age)    # 18

p1 = Person()
p2 = Person()

# p1.age += 2等价于:p1.age = p1.age + 2
# 等号右边是属性访问,整个赋值语句是实例属性的绑定
p1.age += 2
print(Person.age)   # 18
print(p1.age)       # 20
print(p2.age)       # 18

# 等号右边是类属性访问,整个赋值语句是类属性的绑定
Person.age += 3
print(Person.age)   # 21
print(p1.age)       # 20
print(p2.age)       # 21

▽ 类属性和实例属性的比较

Python进阶(4)--类属性◎脚本地址:https://github.com/anzhihe/learning/blob/master/python/practise/learn-python/python_advanced/class_attributes.py

anzhihe 安志合个人博客,版权所有 丨 如未注明,均为原创 丨 转载请注明转自:https://chegva.com/5149.html | ☆★★每天进步一点点,加油!★★☆ | 

您可能还感兴趣的文章!

发表评论

电子邮件地址不会被公开。 必填项已用*标注