python查看类方法
A. python获取类方法的参数列表
用python的inspect模块,inspect.getmembers得到所有的方法(注意第二个参数过滤函数)然后使用inspect.getargspec()得到函数的参数列表,参数类型,python是动态类型语言,这个重要吗
B. python涓鍒ゆ柇鏁板肩被鍨
Python涓鍒ゆ柇鏁板肩被鍨
鍦≒ython涓锛屽垽鏂涓涓鍙橀噺鏄钖︿负鏁板肩被鍨嫔彲浠ラ氲繃澶氱嶆柟娉曞疄鐜般傚父鐢ㄧ殑鏂规硶鍖呮嫭浣跨敤鍐呯疆鍑芥暟`isinstance`鍜宍type`銆备笅闱㈠皢璇︾粏浠嬬粛杩欎袱绉嶆柟娉曘
浣跨敤`isinstance`鍑芥暟鍒ゆ柇鏁板肩被鍨
`isinstance`鍑芥暟鏄疨ython鍐呯疆镄勪竴涓鍑芥暟锛屽彲浠ョ敤𨱒ユ镆ヤ竴涓鍙橀噺鏄钖﹀睘浜庣壒瀹氱殑绫诲瀷銆傚傛灉瑕佸垽鏂涓涓鍙橀噺鏄钖︿负鏁板肩被鍨嬶纴鍙浠ヤ娇鐢ㄥ备笅鏂瑰纺锛
绀轰緥浠g爜锛
python
num = 10
if isinstance): # 鍒ゆ柇鏄钖︿负鏁存暟鎴栨诞镣规暟绫诲瀷
else:
鍦ㄤ笂闱㈢殑浠g爜涓锛宍isinstance`鍑芥暟镄勭涓涓鍙傛暟鏄瑕佹镆ョ殑鍙橀噺锛岀浜屼釜鍙傛暟鏄涓涓鍏幂粍锛屽寘钖浜呜佹镆ョ殑绫诲瀷銆傚湪杩欎釜渚嫔瓙涓锛屾垜浠妫镆ヤ简鍙橀噺`num`鏄钖︿负鏁存暟鎴栨诞镣规暟銆傚傛灉`num`鏄杩欎袱绉岖被鍨嬩箣涓锛岄偅涔堟浔浠舵垚绔嬶纴杈揿嚭“鍙橀噺鏄鏁板肩被鍨”銆傚惁鍒欙纴杈揿嚭“鍙橀噺涓嶆槸鏁板肩被鍨”銆
浣跨敤`type`鍑芥暟鍒ゆ柇鏁板肩被鍨
鍙︿竴绉嶅垽鏂鏁板肩被鍨嬬殑鏂规硶鏄浣跨敤`type`鍑芥暟銆傝繖涓鍑芥暟浼氲繑锲炰竴涓鍙橀噺镄勭被鍨嬩俊鎭銆备絾鏄锛屼娇鐢╜type`鍑芥暟𨱒ュ垽鏂鏁板肩被鍨嬩笉澶熺洿瑙傦纴锲犱负闇瑕佹瘆杈冭繑锲炵殑绫诲瀷钖岖О瀛楃︿覆銆傜ず渚嬩唬镰佸备笅锛
python
num = 10
if type.__name__ in ['int', 'float', 'complex']: # 鍒ゆ柇绫诲瀷钖岖О鏄钖︿负鏁板肩被鍨
else:
python
鍦ㄨ繖娈典唬镰佷腑锛屾垜浠棣栧厛浣跨敤`type`銮峰彇鍙橀噺`num`镄勭被鍨嬩俊鎭锛岀劧钖庨氲繃璁块梾杩欎釜绫诲瀷镄刞__name__`灞炴ф潵銮峰彇绫诲瀷镄勫悕绉板瓧绗︿覆銆傛渶钖庯纴鎴戜滑妫镆ヨ繖涓钖岖О鏄钖︿负'int'銆'float'鎴'complex'锛屼互纭瀹氩彉閲忔槸钖︿负鏁板肩被鍨嬨傚傛灉婊¤冻𨱒′欢锛屽垯杈揿嚭“鍙橀噺鏄鏁板肩被鍨”锛屽惁鍒栾緭鍑“鍙橀噺涓嶆槸鏁板肩被鍨”銆傞渶瑕佹敞镒忕殑鏄锛岃繖绉嶆柟娉曞逛簬澶勭悊镟村嶆潅镄勬暟鎹缁撴瀯鍙鑳戒笉澶熺伒娲诲拰锅ュ.銆傚洜姝ゅ湪瀹为檯搴旂敤涓锛岄氩父镟村惧悜浜庝娇鐢╜isinstance`鍑芥暟𨱒ュ垽鏂鍙橀噺镄勭被鍨嬨
C. python类的属性有哪几种如何访问它们
属性的访问机制
一般情况下,属性访问的默认行为是从对象的字典中获取,并当获取不到时会沿着一定的查找链进行查找。例如a.x的查找链就是,从a.__dict__['x'],然后是type(a).__dict__['x'],再通过type(a)的基类开始查找。
若查找链都获取不到属性,则抛出AttributeError异常。
一、__getattr__方法
这个方法是当对象的属性不存在是调用。如果通过正常的机制能找到对象属性的话,不会调用__getattr__方法。
classA:
a=1
def__getattr__(self,item):
print('__getattr__call')
returnitem
t=A()
print(t.a)
print(t.b)
#output
1
__getattr__call
b
二、__getattribute__方法
这个方法会被无条件调用。不管属性存不存在。如果类中还定义了__getattr__,则不会调用__getattr__()方法,除非在__getattribute__方法中显示调用__getattr__()或者抛出了AttributeError。
classA:
a=1
def__getattribute__(self,item):
print('__getattribute__call')
raiseAttributeError
def__getattr__(self,item):
print('__getattr__call')
returnitem
t=A()
print(t.a)
print(t.b)
所以一般情况下,为了保留__getattr__的作用,__getattribute__()方法中一般返回父类的同名方法:
def__getattribute__(self,item):
returnobject.__getattribute__(self,item)
使用基类的方法来获取属性能避免在方法中出现无限递归的情况。
三、__get__方法
这个方法比较简单说明,它与前面的关系不大。
如果一个类中定义了__get__(),__set__()或__delete__()中的任何方法。则这个类的对象称为描述符。
classDescri(object):
def__get__(self,obj,type=None):
print("callget")
def__set__(self,obj,value):
print("callset")
classA(object):
x=Descri()
a=A()
a.__dict__['x']=1#不会调用__get__
a.x#调用__get__
如果查找的属性是在描述符对象中,则这个描述符会覆盖上文说的属性访问机制,体现在查找链的不同,而这个行文也会因为调用的不同而稍有不一样:
- 如果调用是对象实例(题目中的调用方式),a.x则转换为调用:。type(a).__dict__['x'].__get__(a, type(a))
- 如果调用的是类属性,A.x则转换为:A.__dict__['x'].__get__(None, A)
其他情况见文末参考资料的文档
- 这个调用也属于无条件调用,这点与__getattribute__一致。区别在于__getitem__让类实例允许[]运算,可以这样理解:
- __getattribute__适用于所有.运算符;
- __getitem__适用于所有[]运算符。
- classA(object):
- a=1
- def__getitem__(self,item):
- print('__getitem__call')
- returnitem
- t=A()
- print(t['a'])
- print(t['b'])
- def__getitem(self,item):
- returnobject.__getattribute__(self,item)
- classC(object):
- a='abc'
- def__getattribute__(self,*args,**kwargs):
- print("__getattribute__()iscalled")
- returnobject.__getattribute__(self,*args,**kwargs)
- #return"haha"
- def__getattr__(self,name):
- print("__getattr__()iscalled")
- returnname+"fromgetattr"
- def__get__(self,instance,owner):
- print("__get__()iscalled",instance,owner)
- returnself
- def__getitem__(self,item):
- print('__getitem__call')
- returnobject.__getattribute__(self,item)
- deffoo(self,x):
- print(x)
- classC2(object):
- d=C()
- if__name__=='__main__':
- c=C()
- c2=C2()
- print(c.a)
- print(c.zzzzzzzz)
- c2.d
- print(c2.d.a)
- print(c['a'])
- 可以结合输出慢慢理解,这里还没涉及继承关系呢。总之,每个以__get为前缀的方法都是获取对象内部数据的钩子,名称不一样,用途也存在较大的差异,只有在实践中理解它们,才能真正掌握它们的用法。
四、__getitem__方法
如果仅仅想要对象能够通过[]获取对象属性可以简单的:
总结
当这几个方法同时出现可能就会扰乱你了。我在网上看到一份示例还不错,稍微改了下:
D. python 获取列表元素有几种方式,常见的是哪种
Python中列表常见的方法有哪些?
Python列表定义:按特定顺序排列的元素组成。在Python中,用方括号[]来表示列表,并用逗号来分隔其中的元素。Python列表是编程中很常见的数据类型 。
列表是一种可修改的集合类型,其元素可以是数字、string等基本类型,也可以是列表、元组、字典等集合对象,甚至可以是自定义的类型。其定义方式如下:>>> nums = [1,2,3,4]>>> type(nums)>>> print nums[1, 2, 3, 4]>>> strs = ["hello","world"]>>> print strs['hello', 'world']>>> lst = [1,"hello",False,nums,strs]>>> type(lst)>>> print lst[1, 'hello', False, [1, 2, 3, 4], ['hello', 'world']]
下面我们来看一下列表中有哪些常见的方法:count():统计某个元素在列表中出现的次数。index():从列表中找出某个值第一个匹配项的索引位置。append():在列表末尾添加新对象。extend():在列表末尾一次性追加另一个序列的多个值。insert():在列表的指定位置插入对象。pop():移除列表中的一个元素(默认最后一个元素),并且返回该元素的值。remove():移除列表中某个值的第一个匹配项。reverse():将列表中的元素反向,不重新拷贝一个列表。reversed():将列表中的元素反向,重新拷贝一个列表。sort():将列表中的元素排序,不重新拷贝一个列表。sortd():将列表中的元素排序,重新拷贝一个列表。():浅拷贝,只是给原来的列表贴上了一个新标签,对于一个复杂对象的子对象并不会完全复制,如果有子列表,改变原来的值,新的拷贝对象也会改变。deep():深拷贝,将复杂对象的每一层复制一个单独的个体出来。就是完全拷贝。常见内置函数:max()、min()、sum()、len()、all()、any()、zip()、enumerate()由于文章篇幅有限,具体的代码,推荐大家看这篇文章:https://www.jianshu.com/p/da6e449f4c6a
E. Python中的面向对象(进阶)
一、实例方法,类方法,静态方法
我们首先写一个类,里面包含这三种方法。
可以看到,我们用到了两个装饰器。
我们用类和实例分别调用下类方法
我们用类和实例分别调用下静态方法
静态方法其实就是把一个普通的函数写在类里,与直接在外层写一个函数是一样的,本质上是一个函数。
为了方便理解,我们分别打印下这些方法的类型
通过type()查看对象是方法还是函数
此外,还可以通过inspect模块判断某个对象是否是某种类型,返回布尔值。
用法
小Tips:概念理解
直接def定义的,我们叫做函数
把函数放到类里,我们叫做方法
方法可以通过装饰器staticmethod转为(放在方法里的)函数
继承
一个类继承另一个类时,会自动获得另一个类的所有属性和方法,被继承的类称之为父类,新类称为子类。子类拥有父类所有的属性和方法,并且可以定义自己的属性和方法
我们以上边的Rectangle类为父类来试一下
1)完全继承
可以看到,子类完全继承父类后,可以直接调用父类的所有方法。
2)部分继承
部分继承:继承父类后,修改父类的同名方法
我们试一下,Square继承Rectangle后,修改__init__()方法
3)拓展父类的方法
在保留父类中某个方法的代码同时,对方法进行拓展
可以在方法中加入"super().方法名"来实现
4)@property