Posted liuhuacai

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了类相关的知识,希望对你有一定的参考价值。

一.类的组成

class Who(object):
    what = ‘what‘
    def __init__(self,name,age,gender):
        self.name = name
        self.age = age
        self.gender =gender
    def information(self):
        print(self.name,self.age,self.gender)
p1 = Who(‘张三‘,18,‘男‘)
p1.information()

1.1基本组成部分

  • 由class定义
  • 数据属性:由__init__()定义的部分
  • 函数属性(方法属性):如上的def information(self)部分
  • 实例化:p1 = Who(‘张三‘,18,‘男‘)  
  • 实例化方法:p1.information()
  • 其中的what是什么?

  1>类的属性字典:print(Who.__dicit__)

  {‘__module__‘: ‘__main__‘, ‘what‘: ‘what‘, ‘__init__‘: <function Who.__init__ at 0x00000132B95692F0>, ‘information‘: <function Who.information at 0x00000132D04CAA60>, ‘__dict__‘: <attribute ‘__dict__‘ of ‘Who‘                objects>, ‘__weakref__‘: <attribute ‘__weakref__‘ of ‘Who‘ objects>, ‘__doc__‘: None}

  从类的属性字典中,可以看出:数据属性和函数属性是以内存地址的方式存在的

  2>实例化的属性字典:print(p1.__dict__)

  {‘name‘: ‘张三‘, ‘age‘: 18, ‘gender‘: ‘男‘}

  从实例化的属性字典中,可以看出:已经存储了具体的数据信息

  3>实例化方法的实参传递

  实例化调用类的方法函数:p1.information()

  过程:实例化数据字典{‘name‘: ‘张三‘, ‘age‘: 18, ‘gender‘: ‘男‘}传递给类方法函数information(self)中的self;而self.name,self.age,self.gender实质上是在调用字典中的值 。

  4>作用域问题:【同函数的作用域一致】

  print(Who.what) #what
  print(p1.what)  #what

  不论是实例化,还是类调用what变量,都能够取得对应的值。如同函数的作用于一样,在类的数据属性或实例化的数据属性中找不到what变量,就会到上一层去找。

1.2类数据的【增,删,改,查】

  1.2.1数据【增】:Who.brother = ‘jack‘

  {‘__module__‘: ‘__main__‘, ‘what‘: ‘what‘, ‘__init__‘: <function Who.__init__ at 0x000001DFC85C92F0>, ‘information‘: <function Who.information at 0x000001DFDF54AA60>, ‘__dict__‘: <attribute ‘__dict__‘ of ‘Who‘ objects>,             ‘__weakref__‘: <attribute ‘__weakref__‘ of ‘Who‘ objects>, ‘__doc__‘: None, ‘brother‘: ‘jack‘}

  我们看到,增加的数据属性,增加到__init__的同一级而不是在其内,可以理解为what=‘what’一样的性质

  同以下代码性质相同:

class Who(object):
    what = ‘what‘
    brother = ‘jack‘
    def __init__(self,name,age,gender):
        self.name = name
        self.age = age
        self.gender =gender
    def information(self):
        print(self.name,self.age,self.gender)

  {‘__module__‘: ‘__main__‘, ‘what‘: ‘what‘, ‘brother‘: ‘jack‘, ‘__init__‘: <function Who.__init__ at 0x000001BAA07792F0>, ‘information‘: <function Who.information at 0x000001BAB76AAA60>, ‘__dict__‘: <attribute ‘__dict__‘ of            ‘Who‘ objects>, ‘__weakref__‘: <attribute ‘__weakref__‘ of ‘Who‘ objects>, ‘__doc__‘: None}

  1.2.2数据【删】:del Who.brother

  1.2.3数据【改】:who.what = ‘change‘

  1.2.4数据【查】:print(Who.what)

1.3函数的【增,改】

  1.3.1增加类的方法函数:先定义一个函数,再增加

def sister(self):
    print(self.name,is an only child of family)
Who.sister = sister
print(Who.__dict__)

  {‘__module__‘: ‘__main__‘, ‘what‘: ‘change‘, ‘__init__‘: <function Who.__init__ at 0x0000023683EE92F0>, ‘information‘: <function Who.information at 0x000002369AE4AA60>, ‘__dict__‘: <attribute ‘__dict__‘ of ‘Who‘ objects>,            ‘__weakref__‘: <attribute ‘__weakref__‘ of ‘Who‘ objects>, ‘__doc__‘: None, ‘sister‘: <function sister at 0x0000023683B72EA0>}类的属性字典中增加了一个sister的方法函数

  1.3.1更改类的方法函数:先定义一个函数,再更改

def brother(self):
    print(self.name,have one little brother)
Who.sister = brother
print(Who.__dict__

  更改前:{‘__module__‘: ‘__main__‘, ‘what‘: ‘change‘, ‘__init__‘: <function Who.__init__ at 0x0000020BF10692F0>, ‘information‘: <function Who.information at 0x0000020BFFFCAA60>, ‘__dict__‘: <attribute ‘__dict__‘ of ‘Who‘ objects>,  ‘__weakref__‘: <attribute ‘__weakref__‘ of ‘Who‘ objects>, ‘__doc__‘: None, ‘sister‘: <function sister at 0x0000020BEF1E2EA0>}

     更改后: {‘__module__‘: ‘__main__‘, ‘what‘: ‘change‘, ‘__init__‘: <function Who.__init__ at 0x0000020BF10692F0>, ‘information‘: <function Who.information at 0x0000020BFFFCAA60>, ‘__dict__‘: <attribute ‘__dict__‘ of ‘Who‘ objects>,  ‘__weakref__‘: <attribute ‘__weakref__‘ of ‘Who‘ objects>, ‘__doc__‘: None, ‘sister‘: <function brother at 0x0000020BFFFCAAE8>}

这里我们发现,类的属性字典的key并没有变化,但是key(sister)对应的函数(地址)已经更改了。

1.4实例化的数据属性【增,删,改,查】【注意,这里没有实例化的函数的增删改查】

  1.4.1实例化的数据属性【增】

p1.height = 173
print(p1.__dict__)

  增加前:{‘name‘: ‘张三‘, ‘age‘: 18, ‘gender‘: ‘男‘}

  增加后:{‘name‘: ‘张三‘, ‘age‘: 18, ‘gender‘: ‘男‘, ‘height‘: 173}

  注意:这里仅仅增加了实例化的属性字典,而类的属性字典并没有发生变化

  1.4.2实例化的数据属性【删】:del p1.height

  1.4.3实例化的数据属性【改】:del p1.age = 21

  1.4.4实例化的数据属性【查】:print(del p1.age)

总结:

 

技术图片

 

 注意:类属性字典中的数据属性和函数属性都是存储的内存地址

‘__init__‘: <function Who.__init__ at 0x0000022E412A92F0>, ‘information‘: <function Who.information at 0x0000022E581FAA60>

这里需要特别注意,下面的内容,与之相关。

 

以上是关于类的主要内容,如果未能解决你的问题,请参考以下文章

Android 逆向类加载器 ClassLoader ( 类加载器源码简介 | BaseDexClassLoader | DexClassLoader | PathClassLoader )(代码片段

为啥片段类应该是公开的?

片段内部静态类和gradle问题

从片段类中的对话框添加项目到recyclerview。

如何从片段内的列表视图打开链接网址?

这些角度电子邮件指令代码片段如何连接