python3 类的理解及使用

前言

在设计测试平台初期,框架及代码设计的一坨屎。各种复杂、重复的设计。没有做到极简。总结原因,感觉还是由于基础不够扎实所致。如:

  • 类实例具体是如何初始化的?
  • 类方法的init改如何理解并使用?
  • 类方法的new改如何使用?
  • 类方法的close方法?
  • 类的私有变量及方法变量如何规范使用?
  • 等等诸如此类的问题。
    俗话说“基础不牢,地动山摇”。所以重新整理下一些基础知识。会更有利于设计成熟且赏心悦目的工程。那么接下来,就一一解答下关于“类”的设计吧。

类的方法

类的方法有三种,实例方法,静态方法,类方法。

补充:python中,cls、self参数的区别:
实例方法中,第一个参数需要是self,代表具体实例本身。
如果用了@staticmethod,可以无视self参数,即当成普通函数使用。
如果用了@classmethod,首个参数是cls,而不是self,代表类本身。

实例方法

实例方法只能被实例对象调用。
code:

# coding:utf-8
class Foo(object):
    """类三种方法语法形式"""
 
    def instance_method(self):
        print("是类{}的实例方法,只能被实例对象调用".format(Foo))

# 正确调用
foo = Foo()
foo.instance_method()
print('------------------')
# 错误调用(不能直接调用)
Foo.instance_method()

运行结果如下:

是类<class '__main__.Foo'>的实例方法,只能被实例对象调用
------------------
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unbound method instance_method() must be called with Foo instance as first argument (got nothing instead)

类的实例化顺序

在Python3中所有的类均默认继承object,所以并不需要显式地指定object为基类。
以object为基类可以使得所定义的类具有新类所对应的方法(methods)和属性(properties)。

  1. 调用new生成实例(constructor)
  2. 调用init初始化实例(initializer)

new方法

new所接受的第一个参数是cls,作为构造器,作用是用来创造实例。

  • new函数直接上可以返回别的类的实例

init方法

init方法所接受的第一个参数是self,作为初始化器,作用初始化实例本身。

  • init方法不能有返回值

code

class newStyleClass(object): 

    def __new__(cls):
        print("__new__ is called")
        return super(newStyleClass, cls).__new__(cls)

    def __init__(self):
        print("__init__ is called")
        print("self is: ", self)

newStyleClass()

执行结果:

__new__ is called
__init__ is called
('self is: ', <__main__.newStyleClass object at 0x100b11c90>)
<__main__.newStyleClass object at 0x100b11c90>

由以上代码可见 类的实例化流程,new函数首先被调用,生成一个newStyleClass实例。并且将此实例return给用init方法来初始化,这时候类实例作为self参数传入init函数。
由此引申一下:
假如new方法retun 的是一个已存在的实例,那么init方法就不会被调用。我们现在来验证一下:
code:

# 构造一个已存在的对象
exist_obj = 1 

class TestzClass(object):
    def __new__(cls):
        print("__new__ is called")
        # 返回一个已存在的实例对象
        return exist_obj

    def __init(self):
        print("__init__ is called")

TestzClass()

执行结果:

__new__ is called
1

因此,我们可以用这个特性来构造一个单例模式。
比如:

# coding=utf-8
# 单利模式实现
class Singleton(object):
    _instance = None
    def __new__(cls, *args, **kwargs):
        if not cls._instance:
            # 因为Singleton的__new__方法已修改,被用来判断是否有实例了,这一步通过调用夫类object的__new__方法来实现生成实例
            cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs)
        return cls._instance

# 实例化两个对象        
obj_a = Singleton()
obj_b = Singleton()
# 单例验证
print(obj_a, obj_b)
print(obj_a is obj_b)

执行结果:

(<__main__.Singleton object at 0x1022d69d0>, <__main__.Singleton object at 0x1022d69d0>)
True

可以看到两个实例的内存地址是一致的。其他单例模式实现到时候会有单独再更新。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342

推荐阅读更多精彩内容