前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python笔记58-类里面的__dict__属性

python笔记58-类里面的__dict__属性

作者头像
上海-悠悠
发布2021-08-20 16:56:28
3250
发布2021-08-20 16:56:28
举报

前言

python是面向对象的,对象有属性和方法,可以通过__dict__查看对象的属性

dict查看对象属性

首先弄清楚2个概念,类(A)和类的实例对象(A()), 如下代码

  • count 是A的类属性
  • name和age是 A类的实例对象A()属性
  • start 是实例方法,默认带self参数
  • stop 是静态方法,可以不带默认参数
  • open 是类方法,默认带cls参数
代码语言:javascript
复制
class A(object):
    count = 0

    def __init__(self):
        self.name = "yoyo"
        self.age = 18

    def start(self):
        """实例方法"""
        print("start-11111")

    @staticmethod
    def stop():
        """静态方法"""
        print("stop-22222")

    @classmethod
    def open(cls):
        print("open-3333333")

A类有属性和方法,抽象的来讲,方法也可以看成类的属性(方法属性)

代码语言:javascript
复制
print(A.__dict__)  # A类属性
a = A()    # a是A类的实例对象
print(a.__dict__)   # A类的实例对象属性

运行结果

代码语言:javascript
复制
{'__module__': '__main__', 'count': 0, '__init__': <function A.__init__ at 0x000001F84781AAE8>, 'start': <function A.start at 0x000001F84781AB70>, 'stop': <staticmethod object at 0x000001F84783A2B0>, 'open': <classmethod object at 0x000001F84783A2E8>, '__dict__': <attribute '__dict__' of 'A' objects>, '__weakref__': <attribute '__weakref__' of 'A' objects>, '__doc__': None}
{'name': 'yoyo', 'age': 18}

从运行结果可以看出,A的类属性有count,还有定义的一些方法(__init__构造方法,还有实例方法,静态方法,类方法) A()实例对象只有__init__构造方法里面的name和age属性(count是类属性,并不是类的实例对象属性)

如果我们直接A.name 和 A.age就会报错

代码语言:javascript
复制
print(A.name)
print(A.age)

报错

代码语言:javascript
复制
Traceback (most recent call last):
  File "D:/wangyiyun_hrun3/demo/a.py", line 27, in <module>
    print(A.name)
AttributeError: type object 'A' has no attribute 'name'

因为name和age属性在__init__构造方法里面,只有当A类实例化的时候,才会执行__init__构造方法,这时候才会有name和age属性了

继承时dict属性

当B类继承A类的时候,A类和B类都有自己的类属性 count,也各自有自己的__init__构造方法

代码语言:javascript
复制
class A(object):
    count = 0

    def __init__(self):
        self.name = "yoyo"
        self.age = 18

    def start(self):
        """实例方法"""
        print("start-11111")

    @staticmethod
    def stop():
        """静态方法"""
        print("stop-22222")

    @classmethod
    def open(cls):
        print("open-3333333")

class B(A):
    count = 22

    def __init__(self):
        super().__init__()
        self.name = "hello"
        self.age = 22
    def new(self):
        print("new--44444")

print(A.__dict__)
print(B.__dict__)
a = A()
b = B()
print(a.__dict__)
print(b.__dict__)

运行结果

代码语言:javascript
复制
{'__module__': '__main__', 'count': 0, '__init__': <function A.__init__ at 0x000001FD03F8AAE8>, 'start': <function A.start at 0x000001FD03F8AB70>, 'stop': <staticmethod object at 0x000001FD03FAA470>, 'open': <classmethod object at 0x000001FD03FAA4A8>, '__dict__': <attribute '__dict__' of 'A' objects>, '__weakref__': <attribute '__weakref__' of 'A' objects>, '__doc__': None}
{'__module__': '__main__', 'count': 22, '__init__': <function B.__init__ at 0x000001FD03F8AD08>, 'new': <function B.new at 0x000001FD03F8AD90>, '__doc__': None}
{'name': 'yoyo', 'age': 18}
{'name': 'hello', 'age': 22}

从运行结果可以看出

  • A类和B类的类属性count是不一样的,
  • 虽然B类继承了A类,方法属性也不一样,可以清楚的区分出哪些是A类的方法属性,哪些是B类的方法属性

2021年第八期《python接口web自动化+测试开发》7.17号开学(课程全面升级!) 加量不加价(新增postman, 赠送selenium和python基础2个课)

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-08-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 从零开始学自动化测试 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • dict查看对象属性
  • 继承时dict属性
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档