跳至主要内容

python3语法基础之函数和类

http://ift.tt/2xXd9ze

函数

  1. 什么是函数?
    1. 函数就是一些封装在一起,能够实现某种功能的代码段
  2. 函数的定义
    1. 在python中,函数通过def关键字定义
    2. 定义的格式如下:

def 函数名(参数)

函数体

  1. 实参和形参
    1. 形参
      1. 函数定义的时候,写在参数列表中的变量名
    2. 实参
      1. 调用函数的时候,往函数里传递的数据
  2. 关于return
    1. 执行return语句的时候,肯定会从当前函数退出
    2. return 可以返回值
    3. 如果没有写return ,python中默认 return None
  3. 局部变量和全局变量
    1. 在函数内或者类内定义的变量叫做局部变量,作用域只在函数或类内
    2. 定义在文件中,任何敌方都能访问到的叫全局变量
    3. 可以使用global 关键字把局部变量声明为全局变量
  4. 默认参数
    1. python支持默认参数,也是从右向左赋值

 
 

defTestFun(nNumA=10,nNumB=20):

print(nNumA,nNumB)

 
 

if__name__=="__main__":

TestFun();

TestFun(5,1)

 
 

  1. 关键字参数
    1. 就是可以不按照顺序参数

      defTestFun(nNumA,nNumB):

      print(nNumA,nNumB)

       
       

      if__name__=="__main__":

      TestFun(nNumB=5,nNumA=6)

  2. 变参
    1. python中是通过* 来实现边长参数的

      defTestFun(nNumA,*args):

      print(nNumA)

      print(args)

       
       

      if__name__=="__main__":

      TestFun(1,2,3,4,5,6)

      1. 边长的参数默认是一个元组

 
 


  • 为什么会有面向对象理念?
    • 因为所有的程序都追去的是高内聚,低耦合
    • 所谓高内聚低耦合就是指:
      • 自己做自己的事
      • 不过多的依赖外部的数据和代码
  • 面向对象的特点是什么?
    • 封装,继承,多态
      • 什么是封装?
        • 隐藏数据,封装方法
      • 什么是继承?
        • 有部分或全部的数据和方法可以通用,可以通过继承的方式来减少代码的书写量
      • 什么是多态
        • 对于一种指令,不同的对象有不同的反应
  • 类的定义
    • 类的定义:class 类名(继承自谁):

      classTestClass(object):

      nCount=0

      def __init__(self,nNumA,nNumB):

      self.id=nNumA

      self.age=nNumB

       
       

      def PrintALlNum(self):

      print(self.id,self.age)

       
       

      @classmethod

      def PrintCount(cls):

      print(cls.nCount)

       
       

      @staticmethod

      def PrintWhatEver():

      print(TestClass.nCount)

       
       

      if __name__=="__main__":

      test=TestClass(1,18)

      test.PrintALlNum()

      test.PrintCount()

      test.PrintWhatEver()

      • 注:如果没有父类,默认的父类就是object
      • python中所有的类,追寻到最后,都是继承自object
      • python的构造函数是__init__()
      • 成员函数的第一参数恒为self,这相当于c++中的this指针
        • 不需要给这个self传参
        • 只是需要显式的显示出来
    • 类中的数据
      • 类数据属性
        • 跟c++中的const 成员类似,不属于任何一个对象,只属于类
          • 定义方式类似与上面的nCount
      • 实例数据属性
        • python中把对象叫做实例
        • 实例数据属性需要加self
        • 对象可以在任何敌方加实例数据
          • 只是添加的时候构造函数会被自动调用,所有一般在构造函数中添加数据成员
    • 类中的方法
      • 实例方法(普通成员方法)
        • 参数列表中恒有self
      • 类方法
        • 使用@classmethod修饰符修饰,通过cls访问类的相关属性
      • 静态方法:
        • 跟类方法几乎没有区别,但是如果调用类数据成员的时候,建议使用类方法
  • 继承
    • 类中的继承
      • 继承自多个类,在括号中依次写多个类名即可
      • 如果继承的多个类中,有同名的函数,那么只调用最先继承的那个类的函数
        • 也就是说出现了二义性,先找到谁就算谁的
      • 但是假如你就想使用父类中的同名函数,可以使用super方法来调用

        classHuman(object):

        def__init__(self,name,age):

        self.name=name

        self.age=age

        deffun(self):

        print("我是父类")

         
         

        classStudent(Human):

        def__init__(self,id,name,age):

        super(Student,self).__init__(name,age)#父类的构造需要在子类构造中调用,否则父类的属性不会被创建出来。

        self.id=id

         
         

        deffun(self):

        super(Student,self).fun()

        print("我是子类")

         
         

        xiaoming=Student("xiaoming",20,12)

        print(xiaoming.age)

        xiaoming.fun()

         
         

      • super第一参数是本类,它会根据传入的类名去找父类
      • 第二个参数是对象自己,可以理解为this指针,python中就是self
      • 然后调用父类中的方法即可
  • 类中的权限控制
    • python中的权限控制非常的弱。没有可以完全限制不能访问的情况,只能靠人的自觉

      classCStudent(object):

      def __init__(self,name):

      self.__name=name#一个变量前面加上两个下划线,就不能被外部访问了

      #但是呢,这只是一个假象

      self._age=10#单下划线开头的成员,按照约定俗成的规则,也是私有的,不应该被在外部访问。但是还是可以访问到

      def printName(self):

      print(self.__name)

       
       

       
       

      xiaoming=CStudent("xiaoming")

      xiaoming._age=20

      print(xiaoming._age)

      #print(xiaoming.__name)

      xiaoming._CStudent__name="xiaohong"#还是能修改__name的值

      xiaoming.printName()

  • 类中的一些属性
    • 类中有一些自有的属性,不需要自己定义的

类属性

含义

__name__

类的名字(字符串)

__doc__

类的文档字符串

__bases__

类的所有父类组成的元组

__dict__

类的属性组成的字典

__module__

类所属的模块

__class__

类对象的类型

 
 

  • python中的多态
    • python中的多态有实现有点特别,改天再写

The post python3语法基础之函数和类 appeared first on cole.

http://ift.tt/eA8V8J Python September 12, 2017 at 08:16PM

评论

此博客中的热门博文

反Hook 之自己实现GetProcAddress和LoadLibraryA(c++ version)

http://ift.tt/2AocAD0 // 课上练习.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <windows.h> //要实现的功能: /* 自己实现GerProcAddress LoadLibraryA */ //思路: /* GerProcAddress和LoadLibraryA都是在Kernel32.dll中的 首要的任务就是找到Kernel32.dll,然后遍历IAT就能找到这两个函数 现在首要的难点就是如何找到kernel32.dll() 通过dll的加载顺序可以找到,而且虽然需要使用未文档化的API,但是好在windgb可以直接看,而且用到的也并不是很多 懒得去晚上搜了,直接自己实现一个得了,作为演示,能用就行(最好还是搜一个正规的结构体) */ /* 0: kd> dt _TEB /a nt!_TEB +0x000 NtTib : _NT_TIB +0x01c EnvironmentPointer : Ptr32 Void +0x020 ClientId : _CLIENT_ID +0x028 ActiveRpcHandle : Ptr32 Void +0x02c ThreadLocalStoragePointer : Ptr32 Void +0x030 ProcessEnvironmentBlock : Ptr32 _PEB //首先实现部分TEB结构体,因为只需要用的PEB的部分,所以实现到这就ok了 */ //构建 TEB typedef struct _TEB { //保证0x30是peb的结构体就ok了 struct _tem { DWORD a1; DWORD a2; DWORD a3; DWORD a4; DWORD a5; DWORD a6; DWORD a7; DWORD a8; DWORD a9; DWORD a10; ...

IDA动态调试ELF中遇到的问题(1)

https://ift.tt/2Gxnf2F 遇到 got SIGCHLD singal(child status has changed)...这种提示 singal fork了子进程 直接点yes,然后继续单步执行,出来提示 pass to application就行了 内存查看 用od习惯了之后,凡事都想右键看一下内存,但是IDA中好像没有那么如意, 目前只是在栈中右键发现有查看hex的选项 动态调试的时候的nop ida保存动态调试的时候修改的数据 方法一:在程序运行的时候保存 The post IDA动态调试ELF中遇到的问题(1) appeared first on cole . https://ift.tt/2q9Qf5g WHATEVER April 05, 2018 at 09:44AM

数据库(MySQL)编程之数据库和表的基本操作

http://ift.tt/2gOXg6X     数据库和表的基本操作 操作前的基本知识 基本 sql语句不区分大小写(关键字建议用大小写),但字符串常量区分大小写 sql语句可单行或多行书写,以; 结尾 关键字不能跨行或简写 可以用空格或者缩进来提高可读性 注释 sql标准 /**/ : 多行注释 "--":单行注释 mysql 标准: "#":单行注释 "COMMENT":为字段或列添加注释 创建和查看数据库 创建数据库 模板 CREATE DATABASE [IF NOT EXISTS ] db_name create_specification: IF NOT EXITSTS : 检查数据库是否存在,如果存在就不创建 creat_specification :创建条件 CHARACTER SET: 制定数据聚采用的字符集 COLLATE :制定数据库字符集的比较方式 DEFAULT :表示默认内容,即使没有制定该项,也有默认的值 # 创建数据库使用字符集为 UTF-8 ,使用规则为 uftf_bin CREATE DATABASE db_name DEFAULT CHARACTER SET utf8 COLLATE uft8_bin; 一般默认的数据库就是utf8 和utf8_bin的比较方式,因此一般创建数据库的时候都用 CREATE DATABASE db_name mysql> create database testdb; Query OK, 1 row affected (0.02 sec) 查看数据库 命令 SHOW DATABASES     mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sakila | | sys | | testdb | |...