Python 类属性、实例属性、私有属性

本贴最后更新于 394 天前,其中的信息可能已经天翻地覆

实践是检验真理的唯一标准:拷贝到pycharm一试便知。

一、类属性

1、类属性的创建:写在类里面函数外面

2、访问 类属性:
类的内部:self.类属性名称, 类.类属性名称
在类外面:类实例.类属性名称, 类.类属性名称

3、特点
1、类属性不需要实例化类就能进行访问
2、类属性也可以通过类实例进行访问
3、类实例访问类属性(如果实例属性与类属性同名),实例属性优先级比类属性高

二、实例属性

python 常用魔术方法详解
python 常用魔术方法详解

1、def init(self,name,age):
初始化方法,在类实例化的过程中自动执行
初始化函数的参数在类实例化的时候一起传入,传参方式和函数传参一致cl = TestDemo(age=20,name="郭德纲")

2、实例属性创建:实例属性定义在初始化函数__init__()中,使用self.变量名作为变量名

3、访问 实例属性:
类的内部:self.实例属性名称
在类外面:类实例.实例属性名称
类不能访问实例属性

4、特点
1 实例属性只能在实例化之后才能访问
2 类不能访问实例属性

class TestDemo:
    # 类属性
    name_1 = "刘德华"
    age = 56

    # 实例属性:初始化方法,在类实例化的过程中自动执行,不需要调用
    def __init__(self, name, age):  # self 类实例
        print("__init__自动执行")
        self.first_name = name
        self.all_age = age
        self.name_1 = "达芬奇"

    def test_01(self):
        # 类的内部:self.属性名称
        print("姓名:", self.first_name)  # 类的内部:self.实例属性名称
        print("年龄:", self.all_age)
        print("类内部:类.属性:", TestDemo.name_1)  # 类的内部:类.类属性名称
        print("类内部:self.属性:", self.age)  # 类的内部:self.类属性名称


if __name__ == '__main__':
    cl = TestDemo(age=20, name="郭德纲")
    cl.test_01()
    # __init__自动执行
    # 姓名: 郭德纲
    # 年龄: 20
    # 类内部:类.属性: 刘德华
    # 类内部:self.属性: 56

    # 类实例访问类属性:类实例.类属性名称
    print("类外面:cl.age:", cl.age)
    # 类外面:cl.age: 56

    # 类访问类属性:类.类属性名称
    print("类外面:TestDemo.name_1:", TestDemo.name_1)
    # 类外面:TestDemo.name_1: 刘德华
    # 故类不能访问实例属性

    # 类实例访问实例属性:类实例.实例属性
    print("类外面:cl.name_1:", cl.name_1)  # 在类外面:类实例.实例属性名称
    # 类外面:cl.name_1: 达芬奇
    # 故实例属性优先级比类属性高

    #  类不能访问实例属性:类.实例属性
    print("类外面:TestDemo.all_age:", TestDemo.all_age)  # 在类外面:类实例.实例属性名称
    # 会报错
    # AttributeError: type object 'TestDemo' has no attribute 'all_age'

三、私有属性

1、在类的外面不能被访问的属性,私有属性只能在类的内部使用
2、私有属性通过双下划线开头进行定义:__name、 self.__age
3、强行访问
cl.dict: 获取对象的所有属性,在通过 类.属性名、类实例.属性名 调用。
print(TestDemo._TestDemo__name) 类.属性名
print(cl._TestDemo__age) 类实例.属性名

from pprint import pprint


class TestDemo:
    # 双下划线开头 通常不能访问,特殊方法(获取属性名)能访问,道德素质上不要访问
    __name = "钱包"
    # 单下划线开头 通常能访问,道德上不要访问
    _car = "车"

    def __init__(self, age):
        self.__age = age

    def test_01(self):
        print("self.__name:", self.__name)
        print("self.__age:", self.__age)


if __name__ == '__main__':
    cl = TestDemo(20)
    cl.test_01()
    # self.__name: 钱包
    # self.__age: 20

    # print(TestDemo.__name)
    # # 打印会报错
    # # AttributeError: type object 'TestDemo' has no attribute '__name'

    # 单下划线开头 通常能访问,道德上不要访问
    print("cl._car:", cl._car)
    # cl._car: 车

    # 获取类属性
    pprint(TestDemo.__dict__)
    # mappingproxy({'_TestDemo__name': '钱包',
    #               '__dict__': <attribute '__dict__' of 'TestDemo' objects>,
    #               '__doc__': None,
    #               '__init__': <function TestDemo.__init__ at 0x0000023C41508AE0>,
    #               '__module__': '__main__',
    #               '__weakref__': <attribute '__weakref__' of 'TestDemo' objects>,
    #               '_car': '车',
    #               'test_01': <function TestDemo.test_01 at 0x0000023C4183C4A0>})

    # 获取实例属性
    print("cl.__dict__:", cl.__dict__)
    # cl.__dict__: {'_TestDemo__age': 20}

    # 通过查到的类属性 新key访问
    print("TestDemo._TestDemo__name:", TestDemo._TestDemo__name)
    # 通过查到的实例属性 新key访问
    print("cl._TestDemo__age:", cl._TestDemo__age)
    # 打印结果:
    # TestDemo._TestDemo__name: 钱包
    # cl._TestDemo__age: 20

2 操作
qq5942527 在 2023-03-27 20:30:30 更新了该帖
qq5942527 在 2023-03-27 20:28:28 更新了该帖
回帖
请输入回帖内容 ...