非常规方法
> 有时候我们在用别人的模块是,很好奇里面有什么私有东西,或者好奇对象是什么类型等等,这时候就得借助一些非常规方法去做了。
- type()
> 配合打印函数,可以打印对象是所属什么类型。
```python
print (type('Pocket'))
'''
运行结果:
<type 'str'>
'''
```
- isinstance()
> 可以用来判断某个对象是否属于某种类型
```python
print (isinstance(u'123', str))
'''
python2.7结果:
False
python3.6结果:
True
'''
```
- dir()
> 可以通过dir()函数打印对象的所有属性和方法。返回的是一个list字符串集合
```python
print (dir('Pocket'))
'''
运行结果:['__add__', '__class__', '__contains__', '__delattr__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__getslice__', '__gt__', '__hash__', '__init__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '_formatter_field_name_split', '_formatter_parser', 'capitalize', 'center', 'count', 'decode', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'index', 'isalnum', 'isalpha', 'isdigit', 'islower', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']
'''
```
- hasattr()
> 可以通过hasattr()函数判断对象是否拥有某个属性或者方法。
```python
print (hasattr("Pocket", 'upper')) # 每个字符串都有大写转换方法upper
print ('Pocket'.upper())
'''
运行结果:
True
POCKET
'''
```
- getattr()
> 可以通过getattr()函数获取对象中的所有属性和方法
一般获取的时候,会加如果对象不存在属性或方法的处理,或者和hasattr()函数配合。
```python
s = 'Pocket'
print (type(s.title)) print (getattr(s, 'title')())
如果我们不是很确定对象是否存在某个属性,又怕直接取值报错,我们可以在后面跟一个参数,如果找不到就返回这个
print (getattr(s, '12344', None)) ''' 运行结果:
- setattr()
> setattr函数一般不要乱用,而且千万不要用在自带的一些基本数据类型上。一般适用于类属性上.
有三个参数,第一个是对象,第二个是对象属性,第三个是想要给属性设置的值
注意:如果给一个不存在的属性设置值,其实就是变相的给对象又绑定了一个新属性。
```python
#coding=UTF8
class Classes(object):
"""docstring for Classes 哈哈"""
def __init__(self, name, count):
super(Classes, self).__init__()
self.name = name
self.count = count
self.__test = 'Pocket'
def printCount(self,n):
print(self.count * n)
c = Classes('初三六班',45)
c.printCount(2)
print (type(c)) # 可以通过type()函数去知道对象的类型
print (isinstance(c, Student)) # 可以通过isinstance()函数去知道对象是否属于什么类型
print(dir(c)) # 可以通过dir()函数打印对象的所有属性和方法,在python中没有不能调用的,即使是所谓的私有变量,也是可以调用的,所有要想你好我也好,大家按着规矩来。
print(c.__doc__)
print (getattr(c, 'getName', None)) # 如果我们不是很确定对象是否存在某个属性,又怕直接取值报错,我们可以在后面跟一个参数,如果找不到就返回这个
print (getattr(c,'_Classes__test')) # __test属于私有变量,一般外部很难访问,但是我们用dir()打印了它的变量名变种,然后用getattr()获取
setattr(c,'_Classes__test', 'Baby') # 通过setattr()函数也可以为对象的任何存在的属性赋值,但是一般我们还是不建议这样做,比较私有变量的声明是变相的警告这个东西不要修改
print (getattr(c,'_Classes__test'))
print (hasattr(c, 'printCount')) # 可以通过hasattr()去知道对象是否有对应属性或方法,然后联合getattr,setattr去干坏事
'''
运行结果:
90
<class '__main__.Classes'>
False
['_Classes__test', '__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'count', 'name', 'printCount']
docstring for Classes 哈哈
None
Pocket
Baby
True
'''
- MethodType()
这个方法不得不说很6啊,能动态的给类或者对象绑定类函数。
#coding=UTF8
class Car(object):
"""一个汽车类"""
def __init__(self, number):
super(Car, self).__init__()
self.number = number
from types import MethodType # 导入所需方法
def printCarnumber(self): # 声明一个类函数,用来动态绑定在类对象的函数上
print (self.number)
c1 = Car('赣B-2347C')
'''
动态绑定,使对象c1具备了printCarnumber函数.
注意Car类是不具备printCarnumber函数的,只是单纯绑定在了c1上了
'''
c1.printCarnumber = MethodType(printCarnumber, c1, Car)
c1.printCarnumber()
# 如果想要绑定在类上,只要这么做
def setCarColor(self, color):
self.color = color
Car.setCarColor = MethodType(setCarColor, None, Car) # 绑定一个属性方法在类上,使类所创建的所有对象都具备这个属性
c1.color = 'Red'
print (c1.color)
'''
运行结果:
赣B-2347C
Red
'''