关于python 类的使用
Posted gengyi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于python 类的使用相关的知识,希望对你有一定的参考价值。
用的时候发现关于 python 的一些知识已经忘记一些了,还需要重新查找。
以下是根据记忆和查找网上资料完成的。
1 类命名的形式
(正确)
class One(object): def one_1(self, a): print("a:", a)
object - 父类的名称,表示继承自 object 类。
要是没有父类,也可以直接写程 object ,如上个代码并没有父类,这样写可以。但是如下缩写,就不符合 PEP8 要求(可以运行,但不规范),会提示你删掉括号。
(不太正确)
class One(): def one_1(self, a): print("a:", a)
删除括号后,即为
(正确)
class One: def one_1(self, a): print("a:", a)
也可以理解为,若没有父类,可以什么都不写
2 类的使用
2.1 正确用法
示例
(?错误)
1 class one: 2 def one_1(self, a): 3 print("a:", a) 4 5 get_one = one 6 get_one.one_1(2)
运行
File "C:/Users/Administrator/Desktop/tf.py", line 6, in <module> get_one.one_1(2) TypeError: one_1() missing 1 required positional argument: ‘a‘
报错:one_1 函数缺少一个位置参数,“a”。
我们将传参做修改,变成两个参数。
(错误?,但可以运行)
1 class one: 2 def one_1(self, a): 3 print("self:",self) 4 print("a:", a) 5 6 get_one = one 7 get_one.one_1(2,3)
运行
self: 2
a: 3
很明显,这是由于类没有实例化造成的, get_one = one 只是将类 one 当成一个“变量”赋值给 get_one(实际上是传递了地址),而不是实例化。
将上述代码进行修改,实现类的实例化。
(正确?)
class one: def one_1(self, a): print("a:", a) get_one = one() get_one.one_1(2)
运行
a: 2
2.2 类的实例化 or 赋值——id( )
关于类的赋值还是实例化看其内存地址就可以了(不要较真 深拷贝)。
很明显地址一样的话,肯定是赋值,意味 one 和 get_one_f 指向同一个地址。
实例化则不然,类 one 是一个抽象的“模板”,而实例化的 get_one_s 是一个具体的“对象”,是一个变量;所以它们的地址肯定不一样,经过代码测试确实不是同一地址。
需要注意的是,实例化后的每一个“个体”的地址是不一样的。
class one: def one_1(self, a): print("a:", a) # 赋值 get_one_f = one print("id(one):", id(one)) print("id(get_one_f):", id(get_one_f)) # id(one): 2730363295608 # id(get_one_f): 2730363295608 # 实例化 get_one_s = one() print("id(one):", id(one)) print("id(get_one_s):", id(get_one_s)) # id(one): 2730363295608 # id(get_one_s): 2730377568384
2.3 类的实例化 or 赋值——type()
class one: def one_1(self, a): print("a:", a) print("type(one):", type(one)) print("type(one()):", type(one())) # type(one): <class ‘type‘> # type(one()): <class ‘__main__.one‘>
实例化后的变量可以绑定类中的方法或属性,即 one().one_1(2)
2.4 类中 self 的含义
从上面的运行情况可知,类中self 含义是不一样的。
赋值 | 实例化时 |
class one: def one_1(self, a): print("self:", self) print("a:", a) get_one = one get_one.one_1(2, 3)
|
class one: def one_1(self, a): print("a:", a) print("self :", self) get_one = one() get_one.one_1(2) print("get_one:", get_one) # a: 2 # self : <__main__.one object at 0x00000183C6926048> # get_one: <__main__.one object at 0x00000183C6926048>
|
在看两者的区别时,我们先知悉以下内容:
为了比较,其实我没有添加 __init__ 方法,在该方法中,第一个参数一定是 self,其表示创建实例本身;因此,在 __init__ 方法内部,就可以把各种属性绑定到 self,因此self就指向创建的实例本身。
接下来分析赋值与实例化时的self的含义:
1 赋值时,相当于直接调用类 one 中的 one_1 方法,此时 one_1 仅仅是一个非常普通的函数,而不是一个 ”特殊的函数“。
类中的方法可以当成一个特殊的函数,一个重要的特殊点在于它能够调用类内的属性。
此时 one_1(self, a) 函数中相当于两个常规变量,而不是 “实例化指针”。
2 实例化时,我们实例化例子,self 和 get_one 两者地址是一样的,也就是说,self 就是创建实例本身,凸显类内 “函数” 的特殊性;所以此时只有一个参数。
self : <__main__.one object at 0x00000183C6926048> get_one: <__main__.one object at 0x00000183C6926048>
此时,我想应该可以类比于古代的攻城作战,城池相当于一个类;
当敌人从“外郭”进攻时,堡垒内的所有的兵、民等所有力量都能被调动,这就是实例化;
当敌人直接空降“内城”,对“内城”中的大 BOSS 直接来个斩首行动,这时候“城外”的力量还没有回过神时已经完成作战任务,取走了所需要的“函数”。
所以“空降斩首”明显不现实,不是常规操作。
3 相关参考
廖雪峰 类和实例 https://www.liaoxuefeng.com/wiki/897692888725344/923030500932512
Python中self用法详解https://blog.csdn.net/CLHugh/article/details/75000104
以上是关于关于python 类的使用的主要内容,如果未能解决你的问题,请参考以下文章