day23  01 类的命名空间

一、初识面向对象复习

定义类:

class

函数:方法 动态属性

变量:类属性 静态属性

过程:

(1)_init_方法:初始化:def _init_(self,参数)

  python帮我们创建了一个对象self

  每当我们调用类的时候就会自动触发这个方法

  在_init_方法里面可以对self进行赋值

self是什么:self拥有属性都属于对象

  在类的内部,self就是一个对象

    比如:someone=person(),someone.walk==person.walk(someone),括号里面就是类里面的walk方法所传的参数self,

而且这个参数必须传

(2)实例化:对象=类(参数是_init_方法的)

  实例==对象 没有区别

  对象查看属性:对象.属性

  对象调用方法:对象.方法名(参数)==类名.方法名(对象名,参数)

(3)实例:

  求正方形的周长和面积:

  1. class square:
  2. def __init__(self,side_len):
  3. self.side_len_=side_len
  4. def perimeter(self):
  5. return self.side_len_*
  6. def area(self):
  7. return self.side_len_**
  8. s=square()
  9. print(s.perimeter())
  10. print(s.area())

运行结果:

  1.  

为什么计算这个周长和面积要使用类的调用和方法呢?

  正方形不同的地方就是边长不一样,不同的边长的正方形就归为一类

  有了固定的边长,当调用类里面的方法的时候就不需要再传参数了:print(s.perimeter()) , print(s.area())都不需要再传参数

何为python入门,面向对象入门:

python 入门:当你见到一个需求,你能翻译成python语言

面向对象入门:当你见到一个需求,你能分析这个需求适不适合使用面向对象解决,如果适合,你能有一些想法

二、类和对象的命名空间

类里面可以定义两种属性:

  静态属性:

  动态属性:

定义一个类:一种课程course,属性有:老师,课程名字,课程时间,课程费用

  1. class course:
  2. language='Chinese'
  3. def __init__(self,teacher,course_name,period,price):
  4. self.teacher=teacher
  5. self.course_name=course_name
  6. self.period=period
  7. self.price=price
  8. def func(self):
  9. pass
  10. python=course('李白','python','六个月','')
  11. print(python.teacher)
  12. print(python.course_name)
  13. print(python.period)
  14. print(python.price)
  15. course.language='English' #直接类名.静态属性是可以修改静态属性的
  16. print(course.language)
  17. course.__dict__['language']='English' #但是使用类的字典形式去修改静态属性是不可能的,会报错
  18. print(course.language)
  19. print(python.language) #使用对象调用和查看类下的静态属性是可以的

运行结果:

  1. Traceback (most recent call last):
  2. 李白
  3. File "<encoding error>", line , in <module>
  4. python
  5. TypeError: 'mappingproxy' object does not support item assignment
  6. 六个月
  7.  
  8. Chinese
  9. English

1、为什么对象可以直接调用查看类下的静态属性呢?

  1. print(python.language)---可以且不会报错
  2.  
  3. 类下的命名空间有:language, _init_, func
    对象self里面的命名空间有:teacher, course_name, period, price
  4.  
  5. 类对象指针(内存地址可以有对象的指向类的):可以根据对象属性找到对应的类,但是不能根据类找到对应的对象属性
  1. python.language:首先会在python里面找,如果找不到就会向对应的类中找,找到了就可以调用查看了
  1. course.name:是找不到的
    假设多加一门课程linux
  1. python=course('李白','python','六个月','')
  2. linux=course('秋白','linux','六个月','')

没有改变类下的静态属性language,然后打印

  1. print(python.language)
  2. print(linux.language)

是都可以打印出来的,且都是Chinese,而当通过

  1. course.language='English'

修改静态属性之后,再次打印

  1. print(python.language)
  2. print(linux.language)

结果也都会随之改变,都会变成English,当只通过对象修改类下的静态属性,在打印也是可以改的,如下:

  1. python.language='English'
  2. print(python.language)

2、对于不可变数据类下的类下属性的操作

上面的 python.language='English', print(python.language)的改法实际上是在python对象下创建了一个新的language=‘English’,所以再python里面可以找得到,就不会继续往类下面去找,在类下和linux下面(Linux指向的是类的命名空间)并没有创建新的language,类下的language是不可变的数据类下,所以当打印

  1. print(linux.language)
  2. print(course.language)

的结果还是原来的language的结果,即Chinese所以:

注意:对于不可变的数据类型来说,类变量最好使用类名操作

3、对于可变的数据类型类下属性的操作

比如前面的代码中类下的属性如果是: language=['Chinese'],然后按照下面进行修改打印:

  1. course.language[0]='English'
  2. print(course.language)
  3. print(linux.language)
  4. python.language[0]='English'
  5. print(python.language)
  6. print(course.language)
  7. print(linux.language)
    运行结果:
    ['English']
    ['English']
    ['English']
    ['English']
    ['English']

此时通过对象名对类下的属性进行修改的时候就可以修改成功了,为什么呢?

(1)对于course.language[0]='English'的修改

类下的命名空间里面的language指向一个list的地址,而list的0元素指向的是Chinese的地址,当你通过 course.language[0]='English'

去修改的时候,并没有改变language指向list,对象指向类的命名空间的过程,所以最后都可以通过对象找得到改变的类下的属性;

(2)对于python.language[0]='English'的修改

首先python对象先在自己的命名空间里面找一个可变的数据类型language,找不到就往类的命名空间里面找,因为对象指向类的命名空间,并且可以找到可变的数据类型language,所以在做python里面的修改的时候,类下的也会随之改变

注意:对于可变数据类型来说,通过对象名修改类下属性是共享的,但是如果不是修改而是直接重新赋值的话是独立的(类似于前面的不可变数据类型通过对象名对类下属性是不能修改的)

4、创建一个类,每实例化一个对象就记录下来,最终所有的对象都共享这个数据

比较简单的代码:

  1. class Foo:
  2. count=0
  3. def __init__(self):
  4. Foo.count+=1 #使用类名操作类下属性,对象名调用类下属性的时候,类下属性会随着操作的变化而变化
  5. f1=Foo()
  6. f2=Foo()
  7. print(f1.count)
  8. print(f2.count)
    f3=Foo()
    print(f1.count) #实例化f3,然后通过对象f1操作类下属性,也是可以的,说明通过类名操作类下属性的结果是共享的

运行结果:

  1. 2
  2. 2
    3

这样就能满足每次实例化的时候count就会加一

5、认识绑定方法

一个类也是可以没有_init_方法的初始化的,只不过这样每次实例化的时候创建对象字典里面就没有任何值,是一个空的字典,代码如下:

  1. class Foo:
  2. def func(self):
  3. print('func')
  4. f1=Foo()

运行结果:为空

  1. class Foo:
  2. def func(self):
  3. print('func')
  4. f1=Foo()
  5. print(Foo.func)
  6. print(f1.func)
  7. #这里的打印结果<bound method Foo.func of <__main__.Foo object at 0x0000016551112860>>会告诉我们一个绑定方法
  8. print(f1)

什么叫做绑定方法呢?

只有当对象去调用类下的方法的时候,调用方法的时候必须传入就是该对象,这样对象与方法之间就产生了一种绑定的关系,如果用类名调用就不会产生这种绑定关系

先暂时了解一下,因为后面会讲到类外一种非绑定的方法

6、包中的_init_

为什么我们每次导入一个包就会自动调用执行里面的_init_文件?

因为每次导入一个包 import package====类的实例化过程,包每次被导入就成为一个对象了,所以只要导入就可以使用里面的方法

比如:

import time

time.time

day23 01 类的命名空间的更多相关文章

  1. [Yii2.0] 以Yii 2.0风格加载自定义类或命名空间 [配置使用Yii2 autoloader]

    Yii 2.0最显著的特征之一就是引入了命名空间,因此对于自定义类的引入方式也同之前有所不同.这篇文章讨论一下如何利用Yii 2.0的自动加载机制,向系统中引入自定义类和命名空间.本文旨在抛砖引玉,如 ...

  2. 速战速决 (5) - PHP: 动态地创建属性和方法, 对象的复制, 对象的比较, 加载指定的文件, 自动加载类文件, 命名空间

    [源码下载] 速战速决 (5) - PHP: 动态地创建属性和方法, 对象的复制, 对象的比较, 加载指定的文件, 自动加载类文件, 命名空间 作者:webabcd 介绍速战速决 之 PHP 动态地创 ...

  3. Python 类的命名空间

    Python中类的定义其实就是执行代码块: class cc: a=0 print '+++++', print a 会直接执行print语句而不是在实例化cc时执行.执行后会生成对应的类的命名空间. ...

  4. php加了命名空间没引入初始化文件:类的命名空间要与文件夹名一致namespace Business\Event;缺少了Event

    php加了命名空间没引入初始化文件:类的命名空间要与文件夹名一致namespace Business\Event;缺少了Event

  5. 编译不通过:提示XXXX不是类或命名空间名 的解决办法

    手动写了一个类,需要引入预编译头stdafx.h.结果编译时提示XXXX不是类或命名空间名. 处理方法:将#include "stdafx.h"放在最前面.

  6. day 23-1 类的命名空间、组合

    类的命名空间 类与对象命名空间 类里 可以定义两种属性 静态属性 动态属性 类中的静态变量 可以被对象和类调用对于不可变数据类型来说,类变量最好用类名操作对于可变数据类型来说,对象名的修改是共享的,重 ...

  7. 类的命名空间&组合

    类的命名空间◆类中的静态变量可以被类调用也可以被对象调用◆对不可变数据类型来说,类变量最好用类名操作 class Person: money = 0 mother = Person() father ...

  8. 类型或命名空间名称“Interop”在类或命名空间“Microsoft.Office”中不存在(是否缺少程序集引用?)

    准备用C#编写Web程序,生成Excel报表,在使用下面语句时报错. using Microsoft.Office.Interop.Excel; 报错信息:类型或命名空间名称“Interop”在类或命 ...

  9. C#初始类和命名空间

    本节内容: 1.剖析Hello,World程序 1.1初始类(class)与名称空间(namespace) 2.类库的引用 2.1DLL的引用(黑盒引用) 2.2项目引用(白盒引用) 2.3建立自己的 ...

随机推荐

  1. 51Nod 1095 Anigram单词

    熟练使用map即可,不然用vector会超时 #include <iostream> #include <cstring> #include <string> #i ...

  2. memcache操作

    1 格式(telnet) <command name> <key> <flags> <exptime> <bytes> a) <com ...

  3. nginx memcache缓存

    1 基本 在一个lnmp架构中,nginx遇到动态资源,会反向代理,把请求发送到后端的php-fpm服务,php-fpm从mysql里读取数据,生产网页,然后返回给client. 如果流量大,php- ...

  4. Codeforces Round #395 (Div. 2) B

    Description Young Timofey has a birthday today! He got kit of n cubes as a birthday present from his ...

  5. Django framework

    1. Django 的内置web server是如何实现的 2. Django 的WSGI是如何实现的 3. Django middle ware是如何实现的 4. Django framework的 ...

  6. 142 Linked List Cycle II 环形链表 II

    给一个链表,返回链表开始入环的第一个节点. 如果链表无环,则返回 null.说明:不应修改给定的链表.补充:你是否可以不用额外空间解决此题?详见:https://leetcode.com/proble ...

  7. 01.第一章_C++ Primer学习笔记_开始

    1.2 初始输入输出 iostream库里面包含两个基础类型istream和ostream,分别表示输入流和输出流,一个流就是一个字符序列,从IO设备读出或者写入IO设备. 标准的输入输出对象 标准库 ...

  8. 【学习笔记】彻底理解JS中的this

    首先必须要说的是,this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象(这句话有些问题,后面会解释为什么会有问题,虽然 ...

  9. android studio 导入jar包

    或者还可以这么导入: 1.首先先去下载需要的jar包2.将jar包复制到Project下的app–>libs目录下(没有libs目录就新建一个)如下图所示位置: 3.点击工具栏中的Project ...

  10. 阻止JEB 1.5频繁弹窗的办法

    偶尔才用一次的JEB, 出现 “Controller没有响应或者无法访问, JEB即将终止.” 也懒得去逆了.直接用ProcessHacker找到对应的线程挂起即可.当然这只是临时的办法..我也只是临 ...