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

前言

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

dict查看对象属性

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

  • count 是A的类属性

  • name和age是 A类的实例对象A()属性

  • start 是实例方法,默认带self参数

  • stop 是静态方法,可以不带默认参数

  • open 是类方法,默认带cls参数

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类有属性和方法,抽象的来讲,方法也可以看成类的属性(方法属性)

print(A.__dict__) # A类属性
a = A() # a是A类的实例对象
print(a.__dict__) # A类的实例对象属性

运行结果

{'__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就会报错

print(A.name)
print(A.age)

报错

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__构造方法

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__)

运行结果

{'__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类的方法属性

(0)

相关推荐

  • 温故而知新--day2

    温故而知新--day2 类 类与对象 类是一个抽象的概念,是指对现实生活中一类具有共同特征的事物的抽象.其实列化后称为对象.类里面由类属性组成,类属性可以分为数据属性和函数属性(函数属性又称为类方法) ...

  • Python教程:面向对象编程的一些知识点总结

    类与实例 类是对象的定义,而实例是"真正的实物",它存放了类中所定义的对象的具体信息. 类.属性和方法命名规范 类名通常由大写字母打头.这是标准惯例,可以帮助你识别类,特别是在实例 ...

  • 反射,双下方法

    一. 反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它首先被程序 ...

  • Python获取对象信息之内置函数dir()

    对于类对象或实例对象,可以调用内置函数dir()获取其所有可以访问的属性和方法(包括从父类中继承的属性和方法)的列表.类对象与实例对象的结果是有区别的,类对象的结果不包括实例属性. 示例: #codi ...

  • python学习——类中为什么要定义__init__()方法

    python学习--类中为什么要定义__init__()方法 geerniya 2017-08-22 21:12:41 36244 收藏 188 分类专栏: python 文章标签: python 版 ...

  • Python学习——面向对象高级之反射

    反射 hasattr getattr setattr delattr 模块与函数反射 对象魔术方法 __getattr__(self, name) __setattr__(self, name) __ ...

  • Python魔法方法漫游指南:描述符

    描述符是 Python 语言中一个强大的特性,它隐藏在编程语言的底层,为许多神奇的魔法提供了动力. 如果你认为它只是个花里胡哨.且不太能用到的高级主题,那么本文将帮助你了解为什么描述符是一个非常有意思 ...

  • python笔记60 - 类里面静态方法(@staticmethod),类方法(@classmethod)和实例方法(self)

    前言 python 类里面常用的方法有3个:静态方法(@staticmethod),类方法(@classmethod)和实例方法(self) 本篇讲解这3种方法在使用上有什么区别. 函数 先从函数说起 ...

  • python笔记59-类里面的__getattribute__属性拦截器

    前言 写了一个类,类里面写了几个方法,在调用方法的时候,希望能打印出调用了哪个方法,方便快速定位问题,于是可以用类里面的getattribute属性拦截器. python的类默认都继承了object类 ...

  • python笔记61 - __getattr__ 属性查找学习与使用

    前言 object 类里面有个 __getattribute__ 方法,作用是类实例化调用属性和方法的时候都会调用一次,返回该类的属性. 如果调用的属性没有,会抛出 AttributeError 异常 ...

  • 完整版Python笔记|超级有用

    完整版Python笔记|超级有用

  • 【python笔记】python java 语法,对比学习

    【python笔记】python java 语法,对比学习

  • python笔记2-冒泡排序

    前言 面试的时候经常有面试官喜欢问如何进行冒泡排序?这个问题相信能难倒一批英雄好汉,本篇就详细讲解如何用python进行冒泡排序. 一.基本原理 1.概念: 冒泡排序(Bubble Sort),是一种 ...

  • Selenium2+python自动化73-定位的坑:class属性有空格

    前言 有些class属性中间有空格,如果直接复制过来定位是会报错的InvalidSelectorException: Message: The given selector u-label f-dn ...

  • python笔记3-发送邮件(smtplib)

    前言 本篇总结了QQ邮箱和163邮箱发送邮件,邮件包含html中文和附件,可以发给多个收件人,专治各种不行,总之看完这篇麻麻再也不用担心我的邮件收不到了. 以下代码兼容python2和python3, ...

  • python笔记4-遍历文件夹目录os.walk()

    前言 如何遍历查找出某个文件夹内所有的子文件呢?并且找出某个后缀的所有文件 一.walk功能简介 1.os.walk() 方法用于通过在目录树种游走输出在目录中的文件名,向上或者向下. 2.walk( ...