关于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)

# 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用法详解https://blog.csdn.net/CLHugh/article/details/75000104

 

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

关于理解python类的小题

关于 Python3 元类的一些问题

关于在python类的方法中 实例化其他的类

python 学习--关于类

一个关于python定制类的例子

关于元类的一些使用心得