上文传送门,又见面向对象,不变的是思想,变的只是语言。

今日开始,我们深入来了解面向对象。

四、创建与引用

1、创建对象的流程

在创建对象时,看不见的手,帮我们做了三件事情,如下图:

 1class Student: 2    name = '' 3    height = 0 4    weight = 0 5    age = 0 6    gender = 0 7    def __new__(cls, name, height, weight, age, gender): 8        print("new对象。。") 9        return object.__new__(cls)1011    def __init__(self, name, height, weight, age, gender):12        print('初始化属性。。')13        self.name = name14        self.height = height15        self.weight = weight16        self.age = age17        self.gender = gender1819    def study(self):20        print("我要好好学习。。")21    def introduce(self):22        print("""基本信息如下:23                    姓名:%s24                    性别:%s25                    身高:%d26                    体重:%d27                    年龄:%d28            """ % (self.name, '女' if self.gender == 0 else '男', self.height, self.weight, self.age))2930# 实例化对象31s = Student("小王", 170, 180, 18, 0)32s.introduce()

创建对象,内部执行过程:
调用__new__方法创建一个对象,默认会调用object的__new__方法;
在调用__init__()方法进行属性的声明,就可以对这个对象进行一些操作,或者调用这个对象的方法了,__init__方法仅仅是初始化实例属性的方式之一。关注点:__new__(cls)__init__(self)区别:
1)__new__()方法是一个类方法,第一个参数是class,而__init__()方法是实例方法,第一个参数是实例化的对象
2)__new__()方法比__init__()方法先执行
3)__new__()方法如果不返回对象的话,不会有任何对象被创建。__init__方法就不会被调用,__init__()方法只是初始化参数。

2、对象的地址拷贝

 1class Student(object): 2    name = '' 3    height = 0 4    weight = 0 5    age = 0 6    gender = 0 7    def study(self): 8        print("我要好好学习。。") 9    def smile(self):10        print("不要发出迷你的微笑。。")11    def introduce(self):12        print("""基本信息如下:13                    姓名:%s14                    性别:%s15                    身高:%d16                    体重:%d17                    年龄:%d18            """ % (self.name, '女' if self.gender == 0 else '男', self.height, self.weight, self.age))19            # """ % (s.name, '女' if s.gender == 0 else '男', s.height, s.weight, s.age))2021# 实例化对象22s1 = Student()23s1.name = "张三"24s1.height = 17025s1.weight = 18026s1.age = 1827s2 = s128print("修改前:s对象中的name = %s,s2对象中的name = %s" % (s1.name, s2.name))29s2.name = '隔壁老王'30print("修改后:s对象中的name = %s,s2对象中的name = %s" % (s1.name, s2.name))

新建一个学生类,然后创建s1对象(s = student()),再把这个对象赋值给另外的变量s2 = s1,在修改s2的name属性,会发现s1对象中的name属性会也会修改,这是因为s1和s2指向同一个地址。内存图如下:

3、获取引用对象的计数器

 1class Student: 2    def __init__(self, name, age): 3        self.__name = name 4        self.__age = age 5stu = Student('隔壁老王', 18) 6import sys 7print(sys.getrefcount(stu )) 8stu1 = stu 9print(sys.getrefcount(stu))10stu2 = stu111print(sys.getrefcount(stu))

执行结果为:

122334

注意:打印计数器的时候你会发现会多1个,多的一个是getrefcount()的形参。参考getrefcount的注释:

1getrefcount(object) -> integer23Return the reference count of object.  The count returned is generally4one higher than you might expect, because it includes the (temporary)5reference as an argument to getrefcount().

五、另一种类定义方式

使用class格式定义类,是很常用的方式,不过以后你可能会见到利用type创建类的方式,虽然不那么常见。Type创建类方式本质是手动模拟class创建类的过程,将创建类的步骤拆分开,手动去创建。

1def play(self,sth):2    print("play",sth)3Person = type("a", (object,), {'name': '马云', 'play':play})4p = Person()5print(p.name)6p.play("王者荣耀")7print(dir(p))
1def fn(self,name='world'):2    print('hello,%s.' % name)3Hello = type('Hello',(object,),dict(hello=fn))4h = Hello()5h.hello()6h.hello('python')7print(type(Hello))8print(type(h))

五、另一种类定义方式

使用class格式定义类,是很常用的方式,不过以后你可能会见到利用type创建类的方式,虽然不那么常见。Type创建类方式本质是手动模拟class创建类的过程,将创建类的步骤拆分开,手动去创建。

1def play(self,sth):2    print("play",sth)3Person = type("a", (object,), {'name': '马云', 'play':play})4p = Person()5print(p.name)6p.play("王者荣耀")7print(dir(p))
1def fn(self,name='world'):2    print('hello,%s.' % name)3Hello = type('Hello',(object,),dict(hello=fn))4h = Hello()5h.hello()6h.hello('python')7print(type(Hello))8print(type(h))

六、动态特性

Python动态语言,在运行中可变,其灵活特性使得我们可以轻松加入相关属性、方法,当然内部也提供__slots__简单的制约我们,在python中一切都是自由的、都是自发地遵循规范编写代码,这点务必牢记。

1、变

之前接触过变量,变量的数据类型随使用的数据改变而改变,如万能的盒子:

1box = 'hello'2box = 1003def  add(x,y):4    return x+y5box = add

同理,在类的对象上也可以随意加入属性

1class F:2    def __init__(self):3        pass4f1 = F()5f2 = F()6f1.box = 1007print(f1.box)8# print(f2.box)  # 对f2没有影响

同理也可以给类动态添加函数

 1class F: 2    def __init__(self): 3        pass 4f1 = F() 5f2 = F() 6F.test =lambda self:print('动态添加,so happy') 7f1.test() 8如果为类方法,也可以动态绑定 9class F:10    def __init__(self):11        pass12@classmethod13def cm(cls):14    print("class method")15f1 = F()16F.cm = cm17F.cm()18f1.cm()

同理为静态方法,也简单加入。

 1class F: 2    def __init__(self): 3        pass 4@staticmethod 5def sm(): 6    print("static method") 7f1 = F() 8F.sm = sm 9F.sm()10f1.sm()

这种动态特性,灵活的超乎想象,要是可以一次定义完善,很好,若是不能,这可是很好的助手。

2、不变

由于python的灵活特性,所以可以在任何时刻加自己的属性、方法,如果想制约,可以借助slots来限制,及保护属性和方法

 1class Cat(object): 2    def __init__(self,nick,age,gender): 3    self.nick = nick 4    self.age = age 5    self.gender = gender 6    __slots__ = ('nick','age','gender') #这里限定了实例属性 7 8if __name__ == '__main__': 9    cat = Cat('xiaohua',2,0)10    # cat.kind = 'bosi'11    print(cat.__dict__)

内部就是干掉了dict而已。

如果还想更清楚的了解,可以从接下来的视频获取答案。

python面向对象的实例

两种类的定义

tomcat中request对象是被创建的_Python中对象的创建与引用相关推荐

  1. tomcat中request对象是被创建的_常用开源框架中设计模式使用分析(全)

    一.前言 说起来设计模式,大家应该都耳熟能详,设计模式代表了软件设计的最佳实践,是经过不断总结提炼出来的代码设计经验的分类总结,这些模式或者可以简化代码,或者可以是代码逻辑开起来清晰,或者对功能扩展很 ...

  2. python中变量的作用域有几种_Python中变量的作用域(variable scope)

    http://www.crifan.com/summary_python_variable_effective_scope/ 解释python中变量的作用域 示例: 1.代码版 #!/usr/bin/ ...

  3. python中的return和print的区别_python中return和print的区别(详细)

    Huskiesir python最近正在研究.今天,我面临一个问题,那就是,返回和印刷的区别.双方都能输出结果.的区别是什么?闲话少说,看下面的例子.# Code1: def break_words( ...

  4. python中元祖 字典 列表的区别_Python中元祖,列表,字典的区别

    原博文 2016-08-16 15:25 − Python中有3种內建的数据结构:列表.元祖和字典: 1.列表 list是处理一组有序项目的数据结构,即你可以在一个列表中存储一个序列的项目. 列表中的 ...

  5. python类的定义和创建_Python类对象的创建和使用

    通过前面章节的学习,我们已经学会如何定义一个类,但要想使用它,必须创建该类的对象. 创建类对象的过程,又称为类的实例化. 类名(参数) 定义类时,如果没有手动添加 __init__() 构造方法,又或 ...

  6. python中的字典和类的区别_Python中的 字典和字典数据类型

    字典 1.字典是Python的内建数据类型,我们知道序列是以连续的整数为索引,而字典用关键字作为索引.特别的,关键字必须是不可变类型,常为字符串或者数值. #如果元组中只包含字符串和数字,它可以作为关 ...

  7. python中字典和集合的界定符_python中的字典 和 集合

    python中字典是一种key-value的数据类型 字典的特性: 1.无序的 2.key必须的唯一的,so,字典天生去重 语法: 增加 修改 删除 查找 多级字典嵌套及操作 字典的其他用法 #set ...

  8. 如何用python创建文件_python在指定目录创建文件

    Python无法创建文件夹,如何制定创建目录?温柔也好,凶狠也罢.想有一个陌生的自己,给自己一些惊喜. /主目录/桌面/gnssIR_python-master:/usr/local/bin:/usr ...

  9. python创建以_Python create函数,python,创建

    一.函数定义和声明 在某些编程语言里, 函数声明和函数定义区分开的.一个函数声明包括提供对函数名,参数的名字(传统上还有参数的类型), 但不必给出函数的任何代码, 具体的代码通常属于函数定义的范畴.在 ...

最新文章

  1. php使用NuSoap产生webservice结合WSDL让asp.net调用
  2. mysql 表查询注意
  3. Visual Translation Embedding Network for Visual Relation Detection论文中的术语以及对论文的理解笔记...
  4. 漫画通信:有了它,终于可以放心买买买了
  5. 李倩星r语言实战_《基于R的统计分析与数据挖掘》教学大纲
  6. C++学习之路 | PTA乙级——1090 危险品装箱 (25 分)(精简)
  7. android4以上版本读写外置sd卡报错的解决办法
  8. Apache Camel,Spring Boot 实现文件复制,转移 (转)
  9. c语言中Oo是什么进制整数字,C语言中的大小端存储及原码补码反码的运算关系 %d %u...
  10. linux视频教程百度网盘分享
  11. android日期时间的获取与时差计算
  12. html表单站内搜,网站集成百度、Bing必应搜索引擎,在网页中实现站内全文搜索...
  13. 改变linux字体的大小,如何更改字体并调整其大小?
  14. linux自带查看端口流量命令,iftop命令查看linux系统网卡流量的命令
  15. 最全的硬盘问题及修复方法
  16. 回到1996,一起领略 JavaBeans 的真正力量
  17. 【无标题】USB2514i USB HUB使用经验总结
  18. 基于flowable的审批系统安装及部署
  19. 华为为何取名鸿蒙系统,华为自主操作系统为何取名鸿蒙,看完西游记才知道霸气在哪里?...
  20. android am pm常用的一些命令

热门文章

  1. 一个空间绑定多个域名实现自动跳转的几种方法!
  2. 怎么生成a类型的对象 java_Java工程师考试题(答案)
  3. php 中 app cookie管理,详解iOS App开发中Cookie的管理方法
  4. matlab单位冲击序列代码,matlab产生单位冲击序列 matlab单位冲激函数代码
  5. idea在java文件中查找_Java开发工具IntelliJ IDEA使用源代码系列教程(四):在文件中搜索目标...
  6. 测速源码_解密,相亲交友直播系统源码,高并发如何做到不卡顿
  7. mysql vector查找_vectort
  8. 抓人眼球!插画风精美的网站首页设计欣赏
  9. 萌宠主题页面设计灵感
  10. 手机海报模板,收藏就对了!