九、Python 一些类、实例、内建函数笔记

  1. dir(Myclass)   用来展示一些类的内部属性还有方法,今天IBM面试问到了,居然忘记了,your sister.
  2. print Myclass.__dict__也可以
  3. del c1清除一个引用
  4. 跟踪实例

class InstCt(object):

count =0

def __init__(self):

InstCt.count +=1

def __del__(self):

InstCt.coutn -=1

def howMany(self):

return InstCt.count

[type(getattr(x,i)) for i in (‘conjugate‘,‘imag‘,‘real‘)]

       5.Python 多继承

python和C++一样,支持多继承。概念虽然容易,但是困难的工作是如果子类调用一个自身没有定义的属性,它是按照何种顺序去到父类寻找呢,尤其是众多父类中有多个都包含该同名属性。

  1. class P1 #(object):
  2. def foo(self):
  3. print ‘p1-foo‘
  4. class P2 #(object):
  5. def foo(self):
  6. print ‘p2-foo‘
  7. def bar(self):
  8. print ‘p2-bar‘
  9. class C1 (P1,P2):
  10. pass
  11. class C2 (P1,P2):
  12. def bar(self):
  13. print ‘C2-bar‘
  14. class GC(C1,C2):
  15. pass

对经典类和新式类来说,属性的查找顺序是不同的。现在我们分别看一下经典类和新式类两种不同的表现

1、经典类

  1. d=GC()
  2. d.foo() # 输出 p1-foo
  3. d.bar() # 输出 p2-bar

实例d调用foo()时,搜索顺序是 D => C1 => P1

实例d调用bar()时,搜索顺序是 D => C1 => P1 => P2

换句话说,经典类的搜索方式是按照“从左至右,深度优先”的方式去查找属性。d先查找自身是否有foo方法,没有则查找最近的父类C1里是否有该方法,如果没有则继续向上查找,直到在P1中找到该方法,查找结束。

2、新式类

使用新式类要去掉第一段代码中的注释

  1. d=GC()
  2. d.foo() # 输出 p1-foo
  3. d.bar() # 输出 c2-bar

实例d调用foo()时,搜索顺序是 D => C1 => C2 => P1

实例d调用bar()时,搜索顺序是 D => C1 => C2

可以看出,新式类的搜索方式是采用“广度优先”的方式去查找属性。

它首先查找同胞兄弟,采用的是一种广度优先查找。当查找foo(),它检查GC,然后是C1和C2,然后在P1中找到。如果P1中么有,查到将到达P2。

新式类中还有一个属性__mro__,告诉你的查找顺序。

GC.__mro__

.....

6.issubclass(sub,sup)方法:

True是 False 否

7.isinstance()布尔函数返回是否是另外一个对象的给定的实例。

isinstance(obj1,class)

例子:

class C1(object):pass

class C2(object):pass

c1=C1()

c2=C2()

isinstance(c1,C1) True

isinstance(c2,C1) False

类似JAVA中的instanceof()

hasattr(),getattr(),setattr(),delattr()

super

8.vars()内建函数与dir类似,返回一个字典。

9.classmethod:类方法staticmethod:静态方法

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

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

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

- 类方法有类变量cls传入,从而可以用cls做一些相关的处理。并且有子类继承时,调用该类方法时,传入的类变量cls是子类,而非父类。 对于类方法,可以通过类来调用,就像C.f(),有点类似C++中的静态方法,
也可以通过类的一个实例来调用,就像C().f(),这里C(),写成这样之后它就是类的一个实例了。

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

Example 1:

>>> class a():

@staticmethod

def staticm():

print ‘static‘

def normalm(self):

print ‘nomarl‘,self

@classmethod

def classm(cls):

print ‘class‘,cls

>>> a1=a()

>>> a1.normalm()

nomarl <__main__.a instance at 0x84dddec>

>>> a1.staticm()

static

>>> a1.classm()

class __main__.a

>>> type(a)

<type ‘classobj‘>

>>> type(a1)

<type ‘instance‘>

Example 2:

class A(object):

@classmethod

def cm(cls):

print ‘类方法cm(cls)调用者:‘, cls.__name__

@staticmethod

def sm():

print ‘静态方法sm()被调用‘

class B(A):

pass

A.cm()

B.cm()

A.sm()

B.sm()

输出:

类方法cm(cls)调用者: A

类方法cm(cls)调用者: B

静态方法sm()被调用

静态方法sm()被调用

  1. dir(Myclass)   用来展示一些类的内部属性还有方法,今天IBM面试问到了,居然忘记了,your sister.
  2. print Myclass.__dict__也可以
  3. del c1清除一个引用
  4. 跟踪实例

class InstCt(object):

count =0

def __init__(self):

InstCt.count +=1

def __del__(self):

InstCt.coutn -=1

def howMany(self):

return InstCt.count

[type(getattr(x,i)) for i in (‘conjugate‘,‘imag‘,‘real‘)]

5.Python 多继承

python和C++一样,支持多继承。概念虽然容易,但是困难的工作是如果子类调用一个自身没有定义的属性,它是按照何种顺序去到父类寻找呢,尤其是众多父类中有多个都包含该同名属性。

  1. class P1 #(object):
  2. def foo(self):
  3. print ‘p1-foo‘
  4. class P2 #(object):
  5. def foo(self):
  6. print ‘p2-foo‘
  7. def bar(self):
  8. print ‘p2-bar‘
  9. class C1 (P1,P2):
  10. pass
  11. class C2 (P1,P2):
  12. def bar(self):
  13. print ‘C2-bar‘
  14. class GC(C1,C2):
  15. pass

对经典类和新式类来说,属性的查找顺序是不同的。现在我们分别看一下经典类和新式类两种不同的表现

1、经典类

  1. d=GC()
  2. d.foo() # 输出 p1-foo
  3. d.bar() # 输出 p2-bar

实例d调用foo()时,搜索顺序是 D => C1 => P1

实例d调用bar()时,搜索顺序是 D => C1 => P1 => P2

换句话说,经典类的搜索方式是按照“从左至右,深度优先”的方式去查找属性。d先查找自身是否有foo方法,没有则查找最近的父类C1里是否有该方法,如果没有则继续向上查找,直到在P1中找到该方法,查找结束。

2、新式类

使用新式类要去掉第一段代码中的注释

  1. d=GC()
  2. d.foo() # 输出 p1-foo
  3. d.bar() # 输出 c2-bar

实例d调用foo()时,搜索顺序是 D => C1 => C2 => P1

实例d调用bar()时,搜索顺序是 D => C1 => C2

可以看出,新式类的搜索方式是采用“广度优先”的方式去查找属性。

它首先查找同胞兄弟,采用的是一种广度优先查找。当查找foo(),它检查GC,然后是C1和C2,然后在P1中找到。如果P1中么有,查到将到达P2。

新式类中还有一个属性__mro__,告诉你的查找顺序。

GC.__mro__

.....

6.issubclass(sub,sup)方法:

True是 False 否

isinstance()布尔函数返回是否是另外一个对象的给定的实例。

isinstance(obj1,class)

例子:

class C1(object):pass

class C2(object):pass

c1=C1()

c2=C2()

isinstance(c1,C1) True

isinstance(c2,C1) False

类似JAVA中的instanceof()

hasattr(),getattr(),setattr(),delattr()

super

7.vars()内建函数 返回一个字典。

8.classmethod:类方法staticmethod:静态方法

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

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

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

- 类方法有类变量cls传入,从而可以用cls做一些相关的处理。并且有子类继承时,调用该类方法时,传入的类变量cls是子类,而非父类。 对于类方法,可以通过类来调用,就像C.f(),有点类似C++中的静态方法,
也可以通过类的一个实例来调用,就像C().f(),这里C(),写成这样之后它就是类的一个实例了。

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

Example 1:

>>> class a():

@staticmethod

def staticm():

print ‘static‘

def normalm(self):

print ‘nomarl‘,self

@classmethod

def classm(cls):

print ‘class‘,cls

>>> a1=a()

>>> a1.normalm()

nomarl <__main__.a instance at 0x84dddec>

>>> a1.staticm()

static

>>> a1.classm()

class __main__.a

>>> type(a)

<type ‘classobj‘>

>>> type(a1)

<type ‘instance‘>

Example 2:

class A(object):

@classmethod

def cm(cls):

print ‘类方法cm(cls)调用者:‘, cls.__name__

@staticmethod

def sm():

print ‘静态方法sm()被调用‘

class B(A):

pass

A.cm()

B.cm()

A.sm()

B.sm()

输出:

类方法cm(cls)调用者: A

类方法cm(cls)调用者: B

静态方法sm()被调用

静态方法sm()被调用

时间: 2024-09-29 22:43:51

九、Python 一些类、实例、内建函数笔记的相关文章

python之元编程(元类实例)

本实例是元类实例,功能是记录该的子类的类名,并以树状结构展示子类的类名. RegisterClasses继承自type,提供的功能是在__init__接口,为类创建了childrens的集合,并类名保存到对应的父类元组的childrens的集合中. 同时对__str__打印方法和__iter__迭代方法进行了定义,其中: __iter__方法返回类名的childrens集合,并对其中的元素进行输入. 而Sharp继承自RegisterClasses, 当 for s in Sharp: prin

Python中动态创建类实例

Python中动态创建类实例 简介 在Java中我们可以通过反射来根据类名创建类实例,那么在Python我们怎么实现类似功能呢? 其实在Python有一个builtin函数import,我们可以使用这个函数来在运行时动态加载一些模块.如下: def createInstance(module_name, class_name, *args, **kwargs): module_meta = __import__(module_name, globals(), locals(), [class_n

Python基础-类和实例

下文转载自廖雪峰大神的官方教程,非常感谢! 类和实例 面向对象最重要的概念就是类(Class)和实例(Instance),必须牢记类是抽象的模板,比如Student类,而实例是根据类创建出来的一个个具体的"对象",每个对象都拥有相同的方法,但各自的数据可能不同. 仍以Student类为例,在Python中,定义类是通过class关键字: class Student(object): pass class后面紧接着是类名,即Student,类名通常是大写开头的单词,紧接着是(object

Python的类(class)和实例(Instance)如何操作使用

面向对象最重要的概念就是类(Class)和实例(Instance),必须牢记类是抽象的模板,比如Student类,而实例是根据类创建出来的一个个具体的“对象”,每个对象都拥有相同的方法,但各自的数据可能不同. ![Python的类class和实例instance的操作方法 ](https://img-blog.csdnimg.cn/20181103213647550.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow

Python基础(九) type元类

python元类: type()   元类是python高阶语法. 合理的使用可以减少大量重复性的代码. 元类使用代码: 元类关键字type()  ;元类有三个参数 原型:type('Class',(object,),dict(hello=fun())) 1.class 自定义的类名称 2.(object,)是继承类,的元组,如果只有一个就写这种形势(object,):多个(object,xxxx,) 3.dict(hello=fun())  第三个参数,是一个字典等号左是 自定义的方法名,右侧

python基础教程_学习笔记11:魔法方法、属性和迭代器

魔法方法.属性和迭代器 在python中,有的名称会在前面和后面各加上两个下划线,这种写法很特别.它表示名字有特殊含义,所以绝不要在自己的程序中使用这种名字.在python中,由这些名字组成的集合所包含的方法叫做魔法(或称特殊)方法.如果对象实现了这些方法中的某一个,那么这个方法会在特殊的情况下被python调用,而几乎没有直接调用它们的必要. 准备工作 为了确保类是新型的,应该把赋值语句__metaclass__=type放在你的模块的最开始,或者(直接或间接)子类化内建类(实际上是类型)ob

python基础教程_学习笔记8:序列_练习与总结_1

序列_练习与总结 每次处理一个字符 任务: 用每次处理一个字符的方式处理字符串. 方案: 可以创建一个列表,列表的子项是字符串的字符.python实际上并没有一个特别的类型来对应"字符"并以此和字符串区分开来.可以调用内建的list,用字符串作为参数: thelist=list(thestring) 也可以不创建一个列表,直接用for语句完成对该字符串的循环遍历: for c in thestring: do_something_with(c) 或者使用列表推导中的for来遍历: re

python基础教程_学习笔记23:图形用户界面

图形用户界面 丰富的平台 在编写Python GUI程序前,需要决定使用哪个GUI平台. 简单来说,平台是图形组件的一个特定集合,可以通过叫做GUI工具包的给定Python模块进行访问. 工具包 描述 Tkinter 使用Tk平台.很容易得到.半标准. wxpython 基于wxWindows.跨平台越来越流行. PythonWin 只能在Windows上使用.使用了本机的Windows GUI功能. JavaSwing 只能用于Jython.使用本机的Java GUI. PyGTK 使用GTK

python基础教程_学习笔记3:元组

元组 元组不能修改:(可能你已经注意到了:字符串也不能修改.) 创建元组的语法很简单:如果用逗号分隔了一些值,那么你就自动创建了元组. >>> 1,3,'ab' (1, 3, 'ab') 元组也是(大部分时候是)通过圆括号括起来的. >>> (1,3,'13') (1, 3, '13') 空元组可以用没有内容的两个圆括号来表示. 如何实现包括一个值的元组呢? >>> (5) 5 >>> ('ab') 'ab' >>>

python Class(类) and Object Oriented(面向)

Python类与面向对象    程序=指令+数据 (或算法+数据结构).代码可以选择以指令为核心或以数据为核心进行编写.    两种范型        (1)以指令为核心:围绕"正在发生什么"进行编写(面向过程编程:程序具有一系列线性步骤:主体思想是代码作用于数据)以指令为中心,程序员的主要工作在于设计算法.        (2)以数据为核心:围绕"将影响谁"进行编写(面向对象编程<oop>:围绕数据及为数据严格定义的接口来组织程序,用数据控制对代码的访