什么是类?
类明明的话,大驼峰小驼峰如:BigBoss
类属性:成员都具备的特质
实例属性:一般放在init中初始化

class People(Object):weight = 188def __init__(self,name):self.name = namepass

这个Peole就是一个类
weight就是类属性,使用People.weight来获取
什么是对象?

p = People("xiaoming")

这个p就是对象
p.name就是其中一个实例属性
基础的知识点在这里就不重复说了
类的特点就是封装继承和多态

__init__ __del__

每次我们创建对象之后,python解释器就会自动调用__init__方法;
当删除一个对象时,python解释器也会默认调用一个方法,这个方法为__del__()方法
创建对象时,此对象的引用计数就会+1
当有1个变量保存了对象的引用时,此对象的引用计数就会加1
当使用del删除变量指向的对象时,如果对象的引用计数不会1,比如3,那么此时只会让这个引用计数减1,即变为2,当再次调用del时,变为1,如果再调用1次del,此时会真的把对象进行删除

import time
class Animal(object):# 初始化方法# 创建完对象后会自动被调用def __init__(self, name):print('__init__方法被调用')self.__name = name# 析构方法# 当对象被删除时,会自动被调用def __del__(self):print("__del__方法被调用")print("%s对象马上被干掉了..."%self.__name)

我们可以执行一下代码,验证如下问题:

# 创建对象
dog = Animal("哈皮狗")# 删除对象
del dogcat = Animal("波斯猫")
cat2 = cat
cat3 = catprint("---马上 删除cat对象")
del cat
print("---马上 删除cat2对象")
del cat2
print("---马上 删除cat3对象")
del cat3

结果如下:

继承

class Animal(object):def __init__(self, name='动物', color='白色'):self.__name = nameself.color = colordef __test(self):print(self.__name)print(self.color)def test(self):print(self.__name)print(self.color)class Dog(Animal):def dogTest1(self):#print(self.__name) #不能访问到父类的私有属性print(self.color)def dogTest2(self):#self.__test() #不能访问父类中的私有方法self.test()A = Animal()
#print(A.__name) #程序出现异常,不能访问私有属性
print(A.color)
#A.__test() #程序出现异常,不能访问私有方法
A.test()print("------分割线-----")D = Dog(name = "小花狗", color = "黄色")
D.dogTest1()
D.dogTest2()
  • 私有的属性,不能通过对象直接访问,但是可以通过方法访问
  • 私有的方法,不能通过对象直接访问
  • 私有的属性、方法,不会被子类继承,也不能被访问
  • 一般情况下,私有的属性、方法都是不对外公布的,往往用来做内部的事情,起到安全的作用
    简而言之一句话:
    私有属性可以通过方法被访问,但是不能通过对象被访问,私有属性也不能被继承
    多继承的顺序。当然不知道的时候使用使用print(类名.__mro__)
    一般情况下,class Son(A,B)是先继承A,之后继承B的

重写父类方法与调用父类方法

  • 所谓重写,就是子类中,有一个和父类相同名字的方法,在子类中的方法会覆盖掉父类中同名的方法
  • 不重写的话,就会直接继承
  • 那一般为什么要重写呢,就是因为我们在父类的基础上有新加了一些东西,所以我们在原来的基础上,写新的东西。
  • super()就是代表父类 super().方法()就代表要调用的那个方法。
#coding=utf-8
class Cat(object):def sayHello(self):print("halou-----1")class Bosi(Cat):def sayHello(self):print("halou-----2")bosi = Bosi()bosi.sayHello()
  • 调用父类的方法
#coding=utf-8
class Cat(object):def __init__(self,name):self.name = nameself.color = 'yellow'class Bosi(Cat):def __init__(self,name):# 调用父类的__init__方法1(python2)#Cat.__init__(self,name)# 调用父类的__init__方法2#super(Bosi,self).__init__(name)# 调用父类的__init__方法3super().__init__(name) # 上面的意思就是调用父类方法中的init这个方法def getName(self):return self.namebosi = Bosi('xiaohua')print(bosi.name)
print(bosi.color)

多态

类属性和实例属性

类属性就是类对象所拥有的属性,它被所有类对象的实例对象所共有
类属性还分公有的类属性和私有的类属性
对于公有的类属性,在类外可以通过类对象和实例对象访问
如下示例:

  • 类属性
class People(object):name = 'Tom'  #公有的类属性__age = 12     #私有的类属性p = People()print(p.name)           #正确
print(People.name)      #正确
print(p.__age)            #错误,不能在类外通过实例对象访问私有的类属性
print(People.__age)        #错误,不能在类外通过类对象访问私有的类属性
  • 实例属性(对象属性)
    用类的属性方法是访问不了的
class People(object):address = '山东' #类属性def __init__(self):self.name = 'xiaowang' #实例属性self.age = 20 #实例属性p = People()
p.age =12 #实例属性
print(p.address) #正确
print(p.name)    #正确
print(p.age)     #正确print(People.address) #正确
print(People.name)    #错误
print(People.age)     #错误
  • 通过实例(对象)去修改类属性
class People(object):country = 'china' #类属性print(People.country)
p = People()
print(p.country)
p.country = 'japan'
print(p.country)      #实例属性会屏蔽掉同名的类属性
print(People.country)
del p.country    #删除实例属性
print(p.country)

如果需要在类外修改类属性,必须通过类对象去引用然后进行修改。如果通过实例对象去引用,会产生一个同名的实例属性,这种方式修改的是实例属性,不会影响到类属性,并且之后如果通过实例对象去引用该名称的属性,实例属性会强制屏蔽掉类属性,即引用的是实例属性,除非删除了该实例属性。

静态方法和类方法还有实例方法

实例方法很简单就是通过实例去调用方法,类方法是无法调用的,什么是类方法,如下面那个,就是Peole.方法的形式就是类方法
类方法的话,

类方法

是类对象所拥有的方法,需要用修饰器@classmethod来标识其为类方法,对于类方法,第一个参数必须是类对象,一般以cls作为第一个参数(当然可以用其他名称的变量作为其第一个参数,但是大部分人都习惯以’cls’作为第一个参数的名字,就最好用’cls’了),能够通过实例对象和类对象去访问。

  • 这个cls就是class的简写
  • 调用,类名.方法,实例.方法都是可以的
class People(object):country = 'china'#类方法,用classmethod来进行修饰@classmethoddef getCountry(cls):return cls.countryp = People()
print(People.getCountry())
print(p.getCountry())

结果如下:

  • 类方法还有一个用途就是可以对类属性进行修改:
class People(object):country = 'china'#类方法,用classmethod来进行修饰@classmethoddef getCountry(cls):return cls.country@classmethoddef setCountry(cls,country):cls.country = countryp = People()
print p.getCountry()    #可以用过实例对象引用
print People.getCountry()    #可以通过类对象引用p.setCountry('japan')   print p.getCountry()
print People.getCountry()

静态方法

  • 需要通过修饰器@staticmethod来进行修饰,静态方法不需要多定义参数
  • 也就是不需要self这个占位,也就是刚刚好放在类下面的普通函数,和实例的关系不大。
  • 你加self那就变成了实例方法了
  • 关于调用,使用self.方法和 类名.方法都是可以的
class People(object):country = 'china'@staticmethod#静态方法def getCountry():return People.countryprint People.getCountry()

总结
从类方法和实例方法以及静态方法的定义形式就可以看出来,类方法的第一个参数是类对象cls,那么通过cls引用的必定是类对象的属性和方法;而实例方法的第一个参数是实例对象self,那么通过self引用的可能是类属性、也有可能是实例属性(这个需要具体分析),不过在存在相同名称的类属性和实例属性的情况下,实例属性优先级更高。静态方法中不需要额外定义参数,因此在静态方法中引用类属性的话,必须通过类对象来引用

__new__和__init__的作用

直接总结一下吧

  • __new__至少要有一个参数cls,代表要实例化的类,此参数在实例化时由Python解释器自动提供

  • __new__必须要有返回值,返回实例化出来的实例,这点在自己实现__new__时要特别注意,可以return父类__new__出来的实例,或者直接是object的__new__出来的实例

  • __init__有一个参数self,就是这个__new__返回的实例,__init__在__new__的基础上可以完成一些其它初始化的动作,__init__不需要返回值

  • 我们可以将类比作制造商,__new__方法就是前期的原材料购买环节,__init__方法就是在有原材料的基础上,加工,初始化商品环节

class A(object):def __init__(self):print("这是 init 方法")def __new__(cls):print("这是 new 方法")return object.__new__(cls)A()

结果如下:

单例模式

举个常见的单例模式例子,我们日常使用的电脑上都有一个回收站,在整个操作系统中,回收站只能有一个实例,整个系统都使用这个唯一的实例,而且回收站自行提供自己的实例。因此回收站是单例模式的应用。

确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,单例模式是一种对象创建型模式。

# 实例化一个单例
class Singleton(object):__instance = Nonedef __new__(cls, age, name):#如果类数字能够__instance没有或者没有赋值#那么就创建一个对象,并且赋值为这个对象的引用,保证下次调用这个方法时#能够知道之前已经创建过对象了,这样就保证了只有1个对象if not cls.__instance:cls.__instance = object.__new__(cls)return cls.__instancea = Singleton(18, "dongGe")
b = Singleton(8, "dongGe")print(id(a))
print(id(b))a.age = 19 #给a指向的对象添加一个属性
print(b.age)#获取b指向的对象的age属性

从如下结果中可以看到,指针都是指向同一内存,改变一个实例,不管a还是b都会,都会一致的改变。

  • 创建单例时,只执行1次__init__方法
# 实例化一个单例
class Singleton(object):__instance = None__first_init = Falsedef __new__(cls, age, name):if not cls.__instance:cls.__instance = object.__new__(cls)return cls.__instancedef __init__(self, age, name):if not self.__first_init:self.age = ageself.name = nameSingleton.__first_init = Truea = Singleton(18, "dongGe")
b = Singleton(8, "dongGe")print(id(a))
print(id(b))print(a.age)
print(b.age)a.age = 19
print(b.age)

类的一些魔法函数

def __repr__(self):

def  __repr__(self):''' 返回对象打印出来的效果,名字固定的用法'''return self.属性

getatter()

  • 获取属性,动态获取某个属性的函数
  • 使用方法
    • getatter(对象或者类名,属性名称,当没有这个属性的值时,需要提供一个默认值)

setatter()

不管原来有没有这个属性和这个值,都会赋值给它
使用方法如下:

补充

  • 只要在初始化中__init__定义的变量,在类的函数中,就可以直接用,不需要在函数的参数里面进行说明。

在工作中,逐渐学会了这样的一种用法:感觉很高级,但是在大神面前,那肯定不值一提。

类里面嵌套类

万物皆对象(所以类当然是啦)
  • 其实这种方式有很多应用,就先记录在这里,以后用的时候,希望自己能想到。
class Upload(object):passclass Dotest(object):def __init__(self):self.upload = Upload()

有时候,我们A类里面需要使用B类很多东西的时候,又不对其进行继承,就可以使用这种初始化吧。

举一个很小的例子吧:

class Case:"""测试用例封装类"""def __init__(self):self.id = Noneself.url = Noneself.data = Noneself.title = Noneself.method = Noneself.expected = Noneself.actual = Noneself.result = Noneclass DoExcel:file_name = Nonedef __init__(self, file_name):try:# 操作的文件self.file_name = file_name# 实例化一个workbooK对象self.workbook = openpyxl.load_workbook(filename=file_name)# 异常处理如何做except FileNotFoundError as e:# 文件未找到异常处理print('{0} not found, please check file path'.format(file_name))raise edef get_cases(self, sheet_name):sheet_name = sheet_namesheet = self.workbook[sheet_name]  # 获取sheetmax_row = sheet.max_row  # 获取sheet最大行数cases = []  # 定义一个列表,用来存放即将要放进去的测试用例for r in range(2, max_row + 1):  # for 循环,从第二行开始遍历case = Case()  # 实例化一个case对象,用来存放测试数据case.id = sheet.cell(row=r, column=1).value  # 取第r行,第1格的值case.title = sheet.cell(row=r, column=2).value  # 取第r行,第2格的值case.url = sheet.cell(row=r, column=3).value  # 取第r行,第3格的值case.data = sheet.cell(row=r, column=4).value  # 取第r行,第4格的值case.method = sheet.cell(row=r, column=5).value  # 取第r行,第5格的值case.expected = sheet.cell(row=r, column=6).value  # 取第r行,第6格的值if type(case.expected) == int:case.expected = str(case.expected)cases.append(case)  # 将case放到cases 列表里面return cases  # for 循环结束后返回cases列表

上面的代码已经做了详细的注释,主要是实现一个多个测试用例的,其实最后调用就会得到这样的数据

cases = [case{xxx1},case{xxx2},case{xxx3}...]

Python 类的知识点相关推荐

  1. python 类的知识点整理_Python基础知识点整理,看下你能答对几个

    python高薪就业(视频.学习路线.免费获取)​shimo.im 1.单行注释和多行注释 1. 单行注释 #. 2. 多行注释,前后三个单引号或双引号'''... '''; "" ...

  2. python 类的知识点整理_Python opp知识整理

    面向对象最重要的两个概念就是 类(class)和 实例(Instance),类是抽象的模板(好比数学公式),而实例是根据类创建出来的'对象'(好比用数学公式解出来的题) 还以上面的例子,在Python ...

  3. python常用知识点总结-python 类知识点总结

    python 类知识点总结 面向对象思想: 1.设计的时候,一定要明确应用场景 2.由对象分析定义类的时候,找不到共同特征和技能不用强求 1.简述类.对象.实例化.实例这些名词的含义: 类:从一组对象 ...

  4. 两句话轻松掌握python最难知识点——元类

    两句话掌握python最难知识点--元类 千万不要被所谓"元类是99%的python程序员不会用到的特性"这类的说辞吓住.因为每个中国人,都是天生的元类使用者 学懂元类,你只需要知 ...

  5. python类中方法的执行顺序-Python中实例化class的执行顺序示例详解

    前言 本文主要介绍了关于Python实例化class的执行顺序的相关内容,下面话不多说了,来一起看看详细的介绍吧 Python里对类的实例化时有怎样的顺序 一般来说一个类里面有类变量和方法,比如我们定 ...

  6. python类中方法的执行顺序-Python实例化class的执行顺序实例方法

    Python中实例化class的执行顺序示例详解 前言 本文主要介绍了关于Python实例化class的执行顺序的相关内容,下面话不多说了,来一起看看详细的介绍吧 Python里对类的实例化时有怎样的 ...

  7. python类中成员的的调用

    python类中成员的调用 python类中的方法到底到底是方法还是函数取绝于调用者, 当类名调用这个方法时他是一个函数 class Foo(object):def f1(self):print(&q ...

  8. python @修饰符_数据结构与算法之8——抽象数据类型与python类

    就算你是特别聪明,也要学习,从头学起!--(俄国)屠格涅夫 本篇文章要说的主要是数据结构与算法和python中关于类(Class)以及异常(Error)的一些基础,虽然很简单,但是必须非常重视.只有在 ...

  9. 浅谈Python类的属性和方法

    浅谈Python类的属性和方法 参考文献 在python中,有私有属性和公有属性,方法我们也一样,他们之间有何区别? 还有类属性和实例属性又是怎么回事? 静态方法和类方法又有什么区别? 我们在工作过程 ...

  10. python类的析构方法是什么_python类的析构方法是什么_python类析构

    python __del__ 转自:http://blog.csdn.net/bbdxf/article/details/25774763 最近学习<Python参考手册>学到Class部 ...

最新文章

  1. html里的swal添加倒计时,使用甜蜜警报插件的setInterval函数倒计时
  2. 独家 | 国内AI专业高考报考指南
  3. 【DIY】送给儿子的感应小夜灯,DIY小夜灯
  4. python递归函数错误使用方式
  5. 如何快速上手 AB Testing ?阿里技术专家秘方公开
  6. 计算机组成原理平均cpi怎么算_【计算机考研】每日一题数网操组130
  7. 微信小程序获取windowHeight出现不同页面高度不一致问题及解决方案
  8. 线性判别分析(Linear Discriminant Analysis ,简称LDA)
  9. 阿里彭蕾:CEO如何对抗孤独感?
  10. 毕业设计 基于java的贴吧论坛_java毕业设计_springboot框架的论坛贴吧
  11. 怎么删除计算机c盘应用,C盘垃圾文件怎么删除,清理系统盘的电脑软件-腾讯电脑管家...
  12. 计算机专业页面特效期末考试,《网页设计与制作》期末考试试题及答案.doc
  13. beatedit不能导入音乐/不能加节拍
  14. 《羊了个羊》谁还在玩我笑他两年半
  15. 【网络与信息安全】 2019年-中国计算机学会推荐国际学术会议和期刊目录(三)
  16. Mybatis之错误:Invalid bound statement (not found)
  17. 感恩节 | Hulu Thanksgiving Potluck聚餐
  18. linux命令画圣诞树图片,在Linux终端下显示动画的圣诞树
  19. 银联unionpay取消订单与超时时间
  20. NDK No implementation found for void com.*

热门文章

  1. Nacos 配置不生效
  2. Android Studio代码提示自动补全设置
  3. nginx.conf配置外部 .conf文件
  4. PS如何快速完整的抠头发丝,请看详细的教程
  5. 三.求导四则运算及三角函数导数
  6. 阿里云国际版ECS云服务器ping不通的原因分析
  7. 用代码写个烟花之基础版
  8. 二级域名分发系统美化版网站源码 附搭建教程
  9. Vue之assets图片加载不出来
  10. antd自定义样式主题