www.91084.com

GVKun编程网logo

Python isinstance() 函数用法及实例另类高级使用(附带classmethod 修饰符、json.dumps)

25

如果您想了解Pythonisinstance()函数用法及实例另类高级使用和附带classmethod修饰符、json.dumps的知识,那么本篇文章将是您的不二之选。我们将深入剖析Pythonisi

如果您想了解Python isinstance() 函数用法及实例另类高级使用附带classmethod 修饰符、json.dumps的知识,那么本篇文章将是您的不二之选。我们将深入剖析Python isinstance() 函数用法及实例另类高级使用的各个方面,并为您解答附带classmethod 修饰符、json.dumps的疑在这篇文章中,我们将为您介绍Python isinstance() 函数用法及实例另类高级使用的相关知识,同时也会详细的解释附带classmethod 修饰符、json.dumps的运用方法,并给出实际的案例分析,希望能帮助到您!

本文目录一览:

Python isinstance() 函数用法及实例另类高级使用(附带classmethod 修饰符、json.dumps)

Python isinstance() 函数用法及实例另类高级使用(附带classmethod 修饰符、json.dumps)

描述

isinstance() 函数来判断一个对象是否是一个已知的类型,类似 type()。

isinstance() 与 type() 区别:

  • type() 不会认为子类是一种父类类型,不考虑继承关系。

  • isinstance() 会认为子类是一种父类类型,考虑继承关系。

如果要判断两个类型是否相同推荐使用 isinstance()。

语法

以下是 isinstance() 方法的语法:

isinstance(object,classinfo)

参数

  • object -- 实例对象。
  • classinfo -- 可以是直接或间接类名、基本类型或者由它们组成的元组。

返回值

如果对象的类型与参数二的类型(classinfo)相同则返回 True,否则返回 False。。


实例

以下展示了使用 isinstance 函数的实例:

>>>a = 2
>>> isinstance (a,int)
True
>>> isinstance (a,str)
False
>>> isinstance (a,(str,int,list))    # 是元组中的一个返回 True
True

type() 与 isinstance()区别:

class A:
    pass
 
class B(A):
    pass
 
isinstance(A(),A)    # returns True
type(A()) == A        # returns True
isinstance(B(),A)    # returns True
type(B()) == A        # returns False

实例:

classmethod 修饰符:

 classmethod 修饰符对应的函数不需要实例化,不需要 self 参数,但第一个参数需要是表示自身类的 cls 参数,可以来调用类的属性,类的方法,实例化对象等。

#!/usr/bin/python
# -*- coding: UTF-8 -*-
 
class A(object):
    bar = 1
    def func1(self):  
        print ('foo') 
    @classmethod
    def func2(cls):
        print ('func2')
        print (cls.bar)
        cls().func1()   # 调用 foo 方法
 
A.func2()               # 不需要实例化

json.dumps的参数

import json
from datetime import datetime
import uuid


def json_default(obj):
    if isinstance(obj,datetime):
        print "time"
        return obj.isoformat()
    elif isinstance(obj,uuid.UUID):
        print "uuid"
        return str(obj)
    else:
        return None

#in_data = "11111"
#in_data = datetime.utcNow()
in_data = uuid.uuid1()

data = json.dumps(in_data,default=json_default,ensure_ascii=False)


print data

最终源码实例 :

@classmethod
    def send_log(cls,type,in_data):
        data = json.dumps(in_data,ensure_ascii=False)
        message = '{0} {1}'.format(type,data)
        with cls.socketLock:
            cls.socket.send(message)



def json_default(obj):
    if isinstance(obj,datetime):
        return obj.isoformat()
    elif isinstance(obj,uuid.UUID):
        return str(obj)
    else:
        return None

 

(转)python3-staticmethod与classmethod

(转)python3-staticmethod与classmethod

原文:https://blog.csdn.net/youngbit007/article/details/68957848

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/youngbit007/article/details/68957848
classmethod:类方法
staticmethod:静态方法

在Python中,静态方法和类方法都是可以通过类对象和类对象实例访问。但是区别是:

@classmethod 是一个函数修饰符,它表示接下来的是一个类方法,而对于平常我们见到的则叫做实例方法。 类方法的第一个参数cls,而实例方法的第一个参数是self,表示该类的一个实例。

普通对象方法至少需要一个self参数,代表类对象实例

类方法有类变量cls传入,从而可以用cls做一些相关的处理。并且有子类继承时,调用该类方法时,传入的类变量cls是子类,而非父类。

对于类方法,可以通过类来调用,就像C.f(),有点类似C++中的静态方法, 也可以通过类的一个实例来调用,就像C().f(),这里C(),写成这样之后它就是类的一个实例了。

静态方法则没有,它基本上跟一个全局函数相同,一般来说用的很少

classmethod必须使用类对象作为第一个参数,而staticmethod则可以不传递任何参数。

class Date:

def __init__(self,day=0, month=0, year=0):
self.day=day
self.month = month
self.year = year

@classmethod
def from_string(cls, date_as_string):
day, month, year = map(int,date_as_string.split(''-''))
my_date = cls(day, month, year)
return my_date

@staticmethod
def is_date_valid(date_as_string):
day, month, year = map(int, date_as_string.split(''-''))
return day <= 31 and month <= 12 and year <= 3999


if __name__ == ''__main__'':
my_date = Date.from_string(''11-09-2012'')
print(my_date.day, my_date.month,my_date.year)
is_date = Date.is_date_valid(''13-13-2012'')
print(is_date)

outputs:
11 9 2012
False
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
在来看另外的例子,为了验证有子类继承时,子类调用该类方法时,传入的类变量cls是子类,而非父类

class A:
@classmethod
def cm(cls):
print(''类方法cm(cls)调用者:'', cls.__name__)

@staticmethod
def sm():
print(''静态方法sm()被调用'')

class B(A):
pass

A.cm() # 类方法cm(cls)调用者: A
B.cm() # 类方法cm(cls)调用者: B
A.sm() # 静态方法sm()被调用
B.sm() # 静态方法sm()被调用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
下面我们来看为什么要用到staticmethod与classmethod。

class Kls:
def __init__(self,data):
self.data = data
def printd(self):
print(self.data)

ik1=Kls(''arun'')
ik2=Kls(''seema'')
ik1.printd()
ik2.printd()

# 如果现在我们想写一些仅仅与类交互而不是和实例交互的方法会怎么样呢? 我们可以在类外面写一个简单的方法来做这些,
# 但是这样做就扩散了类代码的关系到类定义的外面. 如果像下面这样写就会导致以后代码维护的困难:
def get_no_of_instances(cls_obj):
return cls_obj.no_inst
class Kls:
no_inst = 0
def __init__(self):
Kls.no_inst = Kls.no_inst + 1
ik1 = Kls()
ik2 = Kls()
print(get_no_of_instances(Kls)) # 2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
应用classmethod

class Kls(object):
no_inst = 0
def __init__(self):
Kls.no_inst = Kls.no_inst + 1
@classmethod
def get_no_of_instance(cls_obj):
return cls_obj.no_inst
ik1 = Kls()
ik2 = Kls()
print(ik1.get_no_of_instance())
print(Kls.get_no_of_instance())
# 2
# 2
1
2
3
4
5
6
7
8
9
10
11
12
13
@staticmethod
经常有一些跟类有关系的功能但在运行时又不需要实例和类参与的情况下需要用到静态方法

classmethod和instancemethod的名称相同吗?

classmethod和instancemethod的名称相同吗?

我想做这样的事情:

class X:

    @classmethod
    def id(cls):
        return cls.__name__

    def id(self):
        return self.__class__.__name__

现在调用id()类或它的实例:

>>> X.id()
'X'
>>> X().id()
'X'

显然,此确切的代码不起作用,但是是否有类似的方法可以使它起作用?还是任何其他解决方法都可以在没有太多“怪异”内容的情况下获得这种行为?

django classonlymethod和python classmethod有什么区别?

django classonlymethod和python classmethod有什么区别?

为什么Django需要引入装饰器classonlymethod?为什么它不能重用python classmethod

python - @staticmethod和@classmethod的作用与区别

python - @staticmethod和@classmethod的作用与区别

一般来说,要使用某个类的方法,需要先实例化一个对象再调用方法。

而使用@staticmethod或@classmethod,就可以不需要实例化,直接类名.方法名()来调用。

这有利于组织代码,把某些应该属于某个类的函数给放到那个类里去,同时有利于命名空间的整洁。

既然@staticmethod和@classmethod都可以直接类名.方法名()来调用,那他们有什么区别呢

从它们的使用上来看,
@staticmethod不需要表示自身对象的self和自身类的cls参数,就跟使用函数一样。
@classmethod也不需要self参数,但第一个参数需要是表示自身类的cls参数。
如果在@staticmethod中要调用到这个类的一些属性方法,只能直接类名.属性名或类名.方法名。


而@classmethod因为持有cls参数,可以来调用类的属性,类的方法,实例化对象等,避免硬编码。

下面上代码。
 

class A(object):
    bar = 1
    def foo(self):
        print ''foo''
 
    @staticmethod
    def static_foo():
        print ''static_foo''
        print A.bar
 
    @classmethod
    def class_foo(cls):
        print ''class_foo''
        print cls.bar
        cls().foo()
 
A.static_foo()
A.class_foo()
输出
static_foo
1
class_foo
1
foo

既然@staticmethod和@classmethod都可以直接类名.方法名()来调用,那他们有什么区别呢
从它们的使用上来看,
@staticmethod不需要表示自身对象的self和自身类的cls参数,就跟使用函数一样。
@classmethod也不需要self参数,但第一个参数需要是表示自身类的cls参数。
如果在@staticmethod中要调用到这个类的一些属性方法,只能直接类名.属性名或类名.方法名。
而@classmethod因为持有cls参数,可以来调用类的属性,类的方法,实例化对象等,避免硬编码。





 

今天关于Python isinstance() 函数用法及实例另类高级使用附带classmethod 修饰符、json.dumps的分享就到这里,希望大家有所收获,若想了解更多关于(转)python3-staticmethod与classmethod、classmethod和instancemethod的名称相同吗?、django classonlymethod和python classmethod有什么区别?、python - @staticmethod和@classmethod的作用与区别等相关知识,可以在本站进行查询。

本文标签: