使用type()
使用type(xxx)函数可以判断基本数据类型和自定义数据类型:
>>> a=10
>>> type(a)
<class 'int'>
>>> type(int)
<class 'type'>
>>> type(dog)
<class '__main__.Dog'>
>>> type(fun)
<class 'function'>
使用types
模块
>>> def f():
pass
>>> type(f)
<class 'function'>
>>> import types
>>> type(f)==types.FunctionType
True
>>> type(for n in range(10))
SyntaxError: invalid syntax
>>> type((x for x in range(10)))
<class 'generator'>
>>> type((x for x in range(10)))==types.GeneratorType
True
所以模块types
包含了函数类型,可以用type()
和其比较,进行判断
使用isinstance()
使用方法:
1. isinstance(x, Class)
判断x是否是Class类型的,比如:
>>> isinstance(1,int)
True
>>> isinstance(dog,Dog)
True
>>> isinstance(dog,Animal)
True
isinstance(x,(Class1,Class2,...))
判断x是否属于Class1,Class2…其中一个数据类型,比如:
>>> isinstance([1,2,3],(list,tuple))
True
>>> isinstance([1,2,3],(dict,tuple))
False
isinstance(x,Class1) and isinstance(x,Class2)
判断x是否属于Class1和Class2。例如:
>>> isinstance(dog,Dog) and isinstance(dog,Animal)
True
>>>
注意:优先使用isinstance()
判断类型,可以将指定类型和子类型都判断。
使用dir()
功能:返回一个对象的所有属性和方法,返回的是一个包含字符串的list。
定义一个类,包含学生的姓名name
和成绩score
:
class Student(object):
name='lm'
def __init__(self,name,score):
self.__name=name
self.__score=score
def Get_Name(self):
return self.__name
def Get_Score(self):
return self.__score
执行如下:
>>> S1=Student('lama',20)
>>> dir(S1)
['Get_Name', 'Get_Score', '_Student__name', '_Student__score', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'name']
以上结果得到的就是实例S1的所有属性和方法,类似__xxx__
的属性和方法都有特殊的意义。我们可以看到两个属性_Student__name
和_Student__score
这其实就是我们定义的私有属性__name
和__score
,我们外部无法访问私有变量,因为内部将私有属性名改变了,当我们访问这两个属性时,其实就是访问了私有变量。所以说,总是有办法访问私有属性的。
getattr(),setattr(),hasattr()
函数的使用
这三个函数从名字就可以看出来,分别是获取实例中的方法或属性,添加实例的方法或属性,判断实例是否有该方法或属性。
比如:
1, hasattr()
无法判断是否有私有属性
>>> hasattr(S1,'name')
True
>>> hasattr(S1,'_Student__name')
True
>>> hasattr(S1,'__name')
False
setattr()
设置属性,也可以添加属性
>>> setattr(S1,'name','LAMA')
>>> S1.name
'LAMA'
>>> setattr(S1,'name_1','LAMA')
>>> S1.name_1
'LAMA'
getattr()
获取并返回属性,若没有该属性则返回指定值
>>> a=getattr(S1,'name')#将S1中的`name`值赋给a
>>> a
'LAMA'
>>> a=getattr(S1,'n',404)#不存在该属性,则赋值404
>>> a
404
注意:
在类中定义的属性,也可以在实例中使用,比如:
class Student(object):
name='lm'
def __init__(self,name,score):
self.__name=name
self.__score=score
def Get_Name(self):
return self.__name
name
就是该类的属性,则每个实例中都存在该属性,比如:
>>> S1=Student('lama',20)
>>> S1.name
'lm'
>>> Student.name
'lm'
但是当实例中也定义了该属性,则实例的属性覆盖类的属性:
>>> S1.name='LAMA'
>>> S1.name
'LAMA'
>>> Student.name
'lm'
当删除该实例的name
属性,则重新将该属性变为类属性:
>>> del S1.name
>>> S1.name
'lm'
所以,不要将类属性和实例属性名重复。