用的时候发现关于 python 的一些知识已经忘记一些了,还须要从新查找。python
如下是根据记忆和查找网上资料完成的。函数
(正确)测试
class One(object): def one_1(self, a): print("a:", a)
object - 父类的名称,表示继承自 object 类。ui
要是没有父类,也能够直接写程 object ,如上个代码并无父类,这样写能够。可是以下缩写,就不符合 PEP8 要求(能够运行,但不规范),会提示你删掉括号。spa
(不太正确).net
class One(): def one_1(self, a): print("a:", a)
删除括号后,即为指针
(正确)code
class One: def one_1(self, a): print("a:", a)
也能够理解为,若没有父类,能够什么都不写对象
示例blog
(❌错误)
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
关于类的赋值仍是实例化看其内存地址就能够了(不要较真 深拷贝)。
很明显地址同样的话,确定是赋值,意味 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
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)
从上面的运行状况可知,类中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 直接来个斩首行动,这时候“城外”的力量尚未回过神时已经完成做战任务,取走了所须要的“函数”。
因此“空降斩首”明显不现实,不是常规操做。
廖雪峰 类和实例 https://www.liaoxuefeng.com/wiki/897692888725344/923030500932512
Python中self用法详解http://www.javashuo.com/article/p-rqyzdjxe-x.html
【整理】Python中:self和__init__的含义 + 为什么要有self和__init__ https://www.crifan.com/summary_the_meaning_of_self_and___init___in_python_and_why_need_them/
这个整理的至关详细,很是赞