关于python 类的使用

用的时候发现关于 python 的一些知识已经忘记一些了,还须要从新查找。python

如下是根据记忆和查找网上资料完成的。函数

1 类命名的形式

(正确)测试

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)

也能够理解为,若没有父类,能够什么都不写对象

2 类的使用

2.1 正确用法

示例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

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)

# self: 2 # a: 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用法详解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/

 

 这个整理的至关详细,很是赞

相关文章
相关标签/搜索