码迷,mamicode.com
首页 > 编程语言 > 详细

关于python 类的使用

时间:2019-10-04 23:18:25      阅读:178      评论:0      收藏:0      [点我收藏+]

标签:深拷贝   详解   运行   ali   还需要   要求   而不是   one   oss   

用的时候发现关于 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 类的使用

标签:深拷贝   详解   运行   ali   还需要   要求   而不是   one   oss   

原文地址:https://www.cnblogs.com/gengyi/p/11623442.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!