面向对象

类(class):实物的模型。

对象:实例化类得到对象。


创建类:

一般方法:

class Person(object):def __init__(self,name,sex):self.name=nameself.sex=sex
p1=Person('刚田武','男')
print(p1.name,p1.sex)

特殊方法:使用type方法:

def talk(self):print('hello,%s'%self.name)
def __init__(self,name,age):self.name=nameself.age=age
Foo=type('Foo',(object,),{'function':talk,'__init__':__init__})     #(object,)中的逗号不能丢,因为此处需要的参数是元组,如果不加逗号就只是一个值,('Foo')效果等同于'Foo',都是值
obj=Foo('胖虎',22)
obj.function()


继承

继承多个类时:

如果子类有构造方法,实例化时执行子类的构造方法;

如果子类没有构造方法,实例化时执行父类的构造方法,按照参数列表从左往右校验父类,如果父类有构造方法则执行,没有构造方法就校验下一个父类,如果父类有构造方法但其构造方法需要的参数数量和实例化时传入的实参数量不等时,程序报错。只能执行一个构造方法。

A为基类,B,C继承自A,D继承B和C,如果D,B,C均没有构造函数,则实例化D时会执行A的构造方法。

python3里都是新式类,使用广度优先继承。D-B,D-B-C,D-B-C-A

python2:

经典类使用深度优先继承:D-B,D-B-A,

新式类使用广度优先继承:D-B,D-B-C,D-B-C-A

经典类:

class father:

  code

新式类:

class father(object):

  code

class People(object): #新式类def __init__(self,name,age):self.name = nameself.age = ageself.friends = []print("in the people class ")def eat(self):print("%s is eating..." % self.name)def talk(self):print("%s is talking..." % self.name)def sleep(self):print("%s is sleeping..." % self.name)
class Relation(object):def make_friends(self,obj):print("%s is making friends with %s" % (self.name,obj.name))self.friends.append(obj.name)
class Man(People,Relation):def __init__(self,name,age,money):super(Man,self).__init__(name,age) #等效于:People.__init__(self,name,age)self.money  = moneyprint("%s 一出生就有%s money" %(self.name,self.money))def sleep(self):People.sleep(self)print("man is sleeping")m1 = Man("刚田武",22,100)
w1=Man('朱二娃',20,100)
m1.sleep()
m1.make_friends(w1)
w1.name = "胖虎"
print(m1.friends[0])

继承


多态:接口重用,一种接口,多种实现。

class Animal(object):def __init__(self,name):self.name=namedef animal_talk(obj):   #此处实现了对Dog和Cat类里talk方法的调用obj.talk()
class Dog(Animal):def talk(self):print('%s****woof,woof!***%s'%(self.name,'aaa'))
class Cat(Animal):def talk(self):print('%s****miow,miow***%s'%(self.name,'aaa'))
d=Dog('朱二娃')
c=Cat('刚田武')
d.talk()    #一般调用方式
c.talk()
Animal.animal_talk(d)   #多态调用方式
Animal.animal_talk(c)

静态方法:名义上归类管理,实际上在静态方法里访问不了类或实例的任何属性。

@staticmethod 修饰(装饰器)

类方法:只能访问类变量,不能访问实例变量

@classmethod

class Animal(object):name='abc'def __init__(self,name):self.name=name@classmethoddef eat(obj):print(obj.name)     #此处的obj是d,name是'abc',是类的变量,不是对象d的变量'朱二娃'print('%s is eating'%obj.name)def animal_talk(obj):obj.talk()
class Dog(Animal):def talk(self):print('%s****woof,woof!***%s'%(self.name,'aaa'))
d=Dog('朱二娃')
d.eat()

属性方法:把一个方法变成一个静态属性,调用属性不需要加括号。可以隐藏实现过程,对用户来说只是属性。

@property

class Animal(object):""" 描述类信息 """# name='abc'def __init__(self,name):self.name=name@propertydef eat(obj):       #此处默认传递的实参是对象d本身print('%s is eating'%obj.name)def animal_talk(obj):obj.talk()
class Dog(Animal):def talk(self):print('%s****woof,woof!***%s'%(self.name,'aaa'))
d=Dog('朱二娃')
d.eat   #不用加括号,就像是调用属性值一样,实际上是把对象d本身传递给属性方法
print(Animal.__doc__)


类的特殊成员方法:

析构方法:__del__

当对象在内存中被释放时,自动触发执行。

class Dog:def __init__(self,name):self.name=namedef __del__(self):print('对象被删除,%s消失'%self.name)
aaa=Dog('二哈')
del aaa

输出:

对象被删除,二哈消失


__call__ 对象后面加括号,触发执行。

注:构造方法的执行是由创建对象触发的,即:对象 = 类名() ;而对于 __call__ 方法的执行是由对象后加括号触发的,即:对象() 或者 类()()

class Dog:def __init__(self,name):self.name=namedef __call__(self, *args, **kwargs):print('执行call方法')def __del__(self):print('对象被删除,%s消失'%self.name)
aaa=Dog('二哈')
aaa()

输出:

执行call方法
对象被删除,二哈消失

程序结束时会自动执行析构函数。

[https://www.cnblogs.com/alex3714/articles/5213184.html]

转载于:https://www.cnblogs.com/zhhy236400/p/9786116.html

Python学习week6--类相关推荐

  1. Python 学习笔记 类的封装 类的继承 多态继承 类方法和静态方法 单例设计模式

    一.类的封装: 1.概念: 广义的封装:函数和类的定义本身,就是封装的体现 狭义的封装:一个类的某些属性,在使用的过程 中,不希望被外界直接访问,而是把这个属性给作为私有的[只有当前类持有],然后暴露 ...

  2. 廖雪峰Python学习笔记——类和实例

    Class MyList(list): __metaclass__ = ListMetaclass #它表示在创建MyList这个类时,必须通过 ListMetaclass这个元类的LIstMetac ...

  3. python学习笔记——类

    # coding='utf-8'class User():def __init__(self,name,sex):self.name = nameself.sex = sexprint '这里是构造函 ...

  4. Python学习笔记④——类、面向对象的三大特征 [封装+继承+多态]

    ✅ Blogger Learns Python is for learning the "Deep Learning". 文章目录 一.面向对象编程的简介 二.类与对象 -- 基础 ...

  5. Python学习(类的属性、继承、覆盖等详解)

    Tips:如果是从基础部分一路跟着过来的朋友,需要告诉你们的是我偷偷吧编程工具PyCharm装上了,今天算是进入面向对象编程环节.本人使用的编程工具是PyCharm,未安装的可以先去官网下载安装.下面 ...

  6. python设计一个长方形类_类设计模式python学习~元类

    废话就不多说了,开始... 元类是类的模版,在类的层次上标准类的行为. 面下用使元类现实单例设计模式(设计模式九 采取的是另一种方法): from warnings import * 每日一道理 坚持 ...

  7. Python学习:类与实例

    面向对象最重要的概念就是类(Class)和实例(Instance),必须牢记类是抽象的模板,比如Student类 而实例是根据类创建出来的一个个具体的"对象",每个对象都拥有相同的 ...

  8. 少说话多写代码之Python学习048——类的成员(supper函数)

    继承父类的构造函数,前面我们在子类的构造函数中调用:父类__init__(self),调用父类的构造函数.这种做法称之为绑定未绑定的父类构造函数.在Python3.0中可以使用supper函数 实现继 ...

  9. 对比文本 python学习 工具类代码

    源代码: import difflib import sysdef readfile(filename):try:fileHandle = open(filename, 'r+')text = fil ...

  10. Python学习项目——类【流浪图书馆】案例

    class Book: def __init__(self, name, author, comment, state=0):self.name = nameself.author = authors ...

最新文章

  1. Android中获取手机的IMEI
  2. 二叉排序树的建立、先序/中序/后序遍历、查找
  3. optee的error codes
  4. 全网最细笔记java与kotlin的一些异同
  5. spring基础整理
  6. Mybatis-Plus 使用自定义注入器后,查询条件中不再添加逻辑删除字段限定条件
  7. Creating DataFrames spark当中重要的部分DataFrames
  8. Qt学习笔记之——生成exe可执行文件并打包生成安装软件
  9. 面试题(Qt + 函数指针)
  10. Web(4)servlet
  11. 阶段3 1.Mybatis_05.使用Mybatis完成CRUD_6 Mybatis的CRUD-保存操作的细节-获取保存数据的id...
  12. Android Socket 服务器ServerSocket发数据到客户端
  13. FastAdmin下拉显示
  14. 题8.9:写一函数,将一个3x3的整型矩阵转置。
  15. 点连线的思路与js的简单实现
  16. 分析报告 | 在线教育APP的市场到底有多大?
  17. 用java web start来发布jbpm(三)
  18. iastora怎么改成ahci_WIN7系统硬盘IDE模式转AHCI模式
  19. C++ 数组名a、数组名取地址a、数组首地址a[0]、数组指针*p
  20. 小程序 绑定监听函数addEvent和通知函数callEvent

热门文章

  1. java 判断两个字符串相等
  2. 一个例子说明贝叶斯定理
  3. [紧急通告]关于蓝色理想经典论坛无法访问的声明
  4. GCC中的编译选项“-I”(大写i),“-L”(大写l),“-l”(小写l)等参数
  5. 项目管理知识体系指南(九)项目沟通管理
  6. jena java,Apache Jena Java工具箱
  7. android开发中即时聊天软件中时间的获得
  8. 有一张厚度为0.1mm的纸,假设它足够大,重复将其对折,问对折多少次之后,其厚度可达(再对折一次就超过)珠穆朗玛峰的高度?(C语言)
  9. android手机存储全面解析汇总
  10. Spider和CrawlSpider的源码分析