一、构造方法

在使用类创建对象的时候(就是类后面加括号)就自动执行__init__方法。

class A:
def __init__(self):
print('A') class B:
def __init__(self):
print('B') obj = A() #虽然只是创建了obj对象,但是执行了__init__方法,输出了A

Python中派生类可以继承父类的构造方法

1.基于super()

遇到super()就表示去执行父类的xxx属性

class A:
def __init__(self):
print('A')
self.tp = 'annimal' class B(A):
def __init__(self):
print('B')
super(B,self).__init__()
#执行B父类中的__init__方法,这里的self是obj
     #super里的self不是传入后面的__init__方法里,而是直接传入A中的__init__,这里super会帮你传递参数 obj = B() 输出结果:
B
A

2.通过父类的名称执行父类的构造方法。

class A:
def __init__(self):
print('A')
self.tp = 'annimal' class B(A):
def __init__(self):
print('B')
A.__init__(self)
#父类的名称跟上__init__() obj = B() 输出结果:
B
A

  这两种方式中推荐super,使用第二中方法的时候,进行继承父类的方法的时候,是你指定父类的方法,看起来比较乱,但是使用super的时候,没有让你指定父类的名称,这种继承时候就按照正常的继承规则(上一节所讲)来进行。

二、反射

利用反射查看面向对象的成员

根据字符串的形式去对象(某个模块)操作其成员

class Foo:
def __init__(self,name):
self.name = name def show(self):
print('Fshow') r = hasattr(Foo,'show')
print(r)
#查看Foo类中是否有show函数
obj = Foo('alexsel')
s = hasattr(obj,'name')
print(s)
#查看obj对象里name是否存在
t = hasattr(obj,'show')
print(t)
#通过对象查看是否存在show这个函数 输出结果:
True
True
True

  我们通过类进行查询的时候,仅仅只能找到类中的属性,但是我们通过类创建的对象查询的时候,我们不但可以找到对象中的属性(例如,self.name,直接在类中查询找不到),还可以找到对象中的方法(例如show函数),因为对象中有一个指向类的指针,当通过对象进行查询的时候,可以通过指针找到类中的属性。

利用反射导入模块、查找类、创建对象、查找对象中的字段

1.首先使用__import__导入文件

函数功能用于动态的导入模块,主要用于反射或者延迟加载模块。

__import__(module)相当于import module

2.使用getattr(所导入的文件名,类名)导入类

getattr根据字符串的形式去某个模块中寻找东西

3.通过找到的类创建对象

4.获取对象中的属性

s2.py文件中的代码

class Foo:
def __init__(self,name):
self.name = name def show(self):
print('Fshow')

s1.py文件中的代码

m = __import__('zp')

class_name = getattr(m,'Foo')

obj = class_name('Alexsel')

val = getattr(obj,'name')

print(val)

输出结果:
Alexsel

三、静态字段

静态字段的作用,将每个对象里存在的重复的东西,使用静态字段在类中只需写一份。

class Foo:

    annimal = 'Cat'
#这个是静态字段,是在类中保存的 def __init__(self,name):
temp = 'Alexsel'
#普通字段,存放在对象中 #普通方法,存放在类中
def show(self):
print('SH') print(Foo.annimal) 输出结果:
Cat

使用静态字段的时候,优先使用类名访问静态字段。

四、静态方法

  静态方法是类中的函数,不需要实例。静态方法主要是用来存放逻辑性的代码,主要是一些逻辑属于类,但是和类本身没有交互,即在静态方法中,不会涉及到类中的方法和属性的操作。

class Foo:
annimal = 'Cat' def __init__(self):
pass def show(self):
print('SH') #装饰器,使用这个装饰器装饰类中的一个方法,这个方法就变为静态方法
@staticmethod
def out():
print('out') Foo.out()
#静态方法中不需要传递self,所以访问静态方法优先使用类去访问
obj = Foo()
obj.out() 输出结果:
out
out

静态方法可以让我们不需要创建对象就可以执行类中的方法。

五、类方法

  类方法是将类本身作为对象进行操作的方法。他和静态方法的区别在于:不管这个方式是从实例调用还是从类调用,它都用第一个参数把类传递过来

class Foo:
annimal = 'Cat' def __init__(self):
pass def show(self):
print('SH') #装饰器,使用这个装饰器装饰类中的一个方法,这个方法就变为类方法
@classmethod
def out(cls):
print('out',cls) Foo.out()
#类方法,会自动将的类传递到类方法的cls中 输出结果:
out <class '__main__.Foo'>

Python学习:16.Python面对对象(三、反射,构造方法,静态字段,静态方法)的更多相关文章

  1. 《转》Python学习(16)-python异常

    转自 http://www.cnblogs.com/BeginMan/p/3171445.html 一.什么是错误,什么是异常,它们两者区别 这里解释如下:个人觉得很通俗易懂 错误是指在执行代码过程中 ...

  2. Python学习-16.Python中的错误处理

    虽然叫错误,但跟 C# 中的异常是一回事.只不过 Python 中叫错误(Error)而 C# 中叫异常(Exception). 先手工产生一个异常: file = open('','r') 上面一句 ...

  3. Python学习day09 - Python进阶(3)

    figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...

  4. python的类和对象(类的静态字段)

    转自:http://www.cnblogs.com/Eva-J/p/5044411.html 什么是静态字段 在开始之前,先上图,解释一下什么是类的静态字段(我有的时候会叫它类的静态变量,总之说的都是 ...

  5. Python学习day05 - Python基础(3) 格式化输出和基本运算符

    figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...

  6. Python学习笔记之类与对象

    这篇文章介绍有关 Python 类中一些常被大家忽略的知识点,帮助大家更全面的掌握 Python 中类的使用技巧 1.与类和对象相关的内置方法 issubclass(class, classinfo) ...

  7. python学习笔记4(对象/引用;多范式; 上下文管理器)

    ### Python的强大很大一部分原因在于,它提供有很多已经写好的,可以现成用的对象 21. 动态类型:对象/引用 对象和引用: 对象是储存在内存中的实体,对象名只是指向这一对象的引用(refere ...

  8. Python学习之路【第三篇】--集合

    语法结构: set1.issubset(set2)判断集合set1是否为set2的子集,返回布尔值. ? 1 2 3 4 5 6 s1 = {'Java', 'PHP', 'Python', 'C++ ...

  9. Python学习历程之面对对象浅识

    # ===============================封装====================================# class Bar:# def __init__(se ...

  10. Python学习笔记—Python基础1 介绍、发展史、安装、基本语法

    第一周学习笔记: 一.Python介绍      1.Python的创始人为吉多·范罗苏姆.1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言 ...

随机推荐

  1. 如何提高Ajax性能

    1.适当使用缓存机制 2.使用CDN内容分发来访问Jquery脚本: (1)自己公司架设CDN服务器 (2)使用第三方公司的,比如微软,谷歌等公司的CDN,但有时候不太靠谱 3.JS/CSS文件的打包 ...

  2. FTP列出文件列表

    #定义FTP服务器地址$ftpURL = "ftp://192.168.12.6/"#定义登录FTP服务器的账户及密码$username = "testj\adadmin ...

  3. Effective C++(5) 了解C++默默地编写并调用哪些函数

    预热: 一个空的类,当编译器处理过之后,就包含: 一个copy构造函数 一个重载赋值操作符 一个析构函数 一个默认构造函数 Demo: class Empty() { }; // 声明一个空的类 cl ...

  4. Strsafe.h:更安全的C语言字符串处理函数

    原文出处:Strsafe.h: Safer String Handling in C 作者:Michael Howard 编译:王凌峰 在微软公司举行的Microsoft Windows Securi ...

  5. Chapter 2 Secondary Sorting:Detailed Example

    2.1 Introduction MapReduce framework sorts input to reducers by key, but values of reducers are arbi ...

  6. c++计算器后续(1)

    自娱自乐: 大概是一直在说的代码规范,大概是玩一玩,以上. 代码规范: 参考原文:链接 相关节选: 4 程序的版式 4.4规则:较长的语句(>80字符)要分成多行书写. 4.5规则:不允许把多个 ...

  7. jq实现多级菜单

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  8. UVa 10288 - Coupons(数学期望 + 递推)

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  9. [19/04/30-星期二] GOF23_行为型模式(中介者模式、命令模式、解释器模式、访问者模式)

    一.中介者模式(meditor) [中介] /*** * 抽象中介者接口和其具体实现类"经理"类 */ package cn.sxt.meditor; import java.ut ...

  10. 【金融123】ISDA协议

    http://blog.sina.com.cn/s/blog_799af92f0100ur03.html http://www.nafmii.org.cn/ NAFMII 官方文档 NAFMII_Ma ...