一、一个类可以定义两种属性:静态属性和动态属性
(一)对于不可变数据类型来说,类变量最好用类名操作,也可以用对象操作,但是只能查,不能改,对象改的都只是相当于在自己的命名空间里重新建立了一个
class Person:
language='Chinese' #字符串是不可变数据类型
def __init__(self): #可以没有参数
pass
1.类操作(根据上面的例子)

print(Person.language) #Chinese 类操作

Person.language='English' #类操作更改类属性
print(Person.language) #English
2.对象操作类属性,不建议用,看一下详解‘坑’
查,是没有什么问题的,查的过程是对象buty现在自己的命名空间找,找不到从类的命名空间找,再找不到就报错,这里要谨记对象不能找全局作用域
buty=Person()            #定义一个对象
mary=Person()
print(buty.language) #Chinese #对象操作,但是不能更改类属性,只能查
print(mary.language) #Chinese 同上
改,不可以改类属性,原因如下:
buty.language='English'
print(Person.language)    #Chinese
print(buty.language)    #English  说明对象操作不能更改类属性,只能查, 这种操作只是在对象buty是内存空间添加了language='English’
(二)对于可变数据类型来说,类对象名的修改是共享的,重新赋值是独立的(但是通过对象对类名的操作都是在对象的命名空间里重新建立了一个,对类的静态属性没有任何影响)
class Person:
language=['Chinese'] #列表是可变数据类型
def __init__(self): #可以没有参数
pass
1.类操作

print(Person.language) # ['Chinese'] 类操作

Person.language[0]='English' #列表通过索引修改,
Person.language.append('japanses')    #通过append添加
print(Person.language) # ['English', 'japanses']
Person.language=['English']     #['English']  #虽然也是成功修改成了English,但是实质是内部的重新赋值,不会再打印‘japanses’
Person.__dict__['language']='English' # 报错,这种写法不能改变类属性,因为面向对象中的 dict 不支持项目分组 print(Person.language)
2.对象操作
#对象操作:修改类对象,对象操作查看类对象,
buty=Person() #定义一个对象
mary=Person()
buty.language [0]='English' # ['English'] #先通过对象操作修改类对象
print(buty.language) #['English'] #对象操作修改类对象,对于不同对象的操作查看的时候,结果是共享的
print(mary.language) #['English'] #虽然只是通过buty修改类对象,但是mary也会跟着修改langusage,会共享修改结果
# 对象操作:重新赋值类对象,对象操作查看类对象
buty.language=['English'] #对象操作重新赋值类对象
print(buty.language) #['English'] #
print(mary.language) #['Chinese'] #通过buty对象操作重新赋值类对象,mary的language不会改变,因为重新赋值是独立的
print(Person.language) #['Chinese']
(三)练习题
创建一个类,每实例化一个对象就计数
最终所有的对象共享这个数据
class Person:
count=0
count+=1
def __init__(self):
pass
join=Person()
print(Person.count)

一方法

class Foo:
count = 0
def __init__(self):
Foo.count += 1
f1 = Foo()
print(f1.count)

二方法

(四)认识绑定方法:对象名.方法
class Foo:
def func(self): #定义一个方法
pass
f1=Foo()
print(f1.func) # 绑定<bound method Foo.func of <__main__.Foo object at 0x01833BB0>>
#对比打印
print(Foo.func) #<function Foo.func at 0x018721E0>
print(f1) #<__main__.Foo object at 0x00713BB0>
print(Foo) #<class '__main__.Foo'>

绑定实例

(五)总结:
# 类里的名字有 类变量(静态属性量)+ 方法名(动态属性)
# 对象里的名字 对象属性
# 对象 —— > 类
# 对象找名字 : 先找自己的 找类的 再找不到就报错
# 对象修改静态属性的值
# 对于不可变数据类型来说,类变量最好用类名操作
# 对于可变数据类型来说,对象名的修改是共享的,重新赋值是独立的
二、组合 在一个类里面调用另一个类方法
from math import pi
class Circle:
def __init__(self,r):
self.r = r
def area(self):
return self.r**2 * pi
def perimeter(self):
return 2*pi*self.r
class Ring:
def __init__(self,c_1,c_2): #ring = Ring(10,5)把10和5 传进去给c_1=10 c_2=5
self.c_1=Circle(c_1) #Circle(10) 在内部实例化外部一个类
# Circle(10)得到一个对象,进而self.c_1==Circle类的一个对象ring,进而self.c_1.area()是在调用Circle类的面积公式
self.c_2=Circle(c_2) #Circle(5)
def area(self): #下面的调用ring.area(),意思是把ring传给self
return self.c_1.area()-self.c_2.area()
def perimeter(self):
return self.c_1.perimeter() + self.c_2.perimeter()
ring = Ring(10,5)
print(ring.area()) #==print(Ring.area(ring))
print(ring.perimeter())
练习:运用组合:输出老师的生日
class Teacher:
def __init__(self,name,birthday):
self.name=name
self.b_t=birthday
class Birthday:
def __init__(self,birthday):
self.birthday=birthday
b=Birthday('2015.2.4')
t=Teacher('join',b)
print(t.b_t.birthday) #

#方法一

class Teacher:
def __init__(self,name,birthday):
self.name=name
self.t_b=Birthday(birthday)
class Birthday:
def __init__(self,birthday):
self.birthday=birthday
t=Teacher('join',2018)
print(t.t_b.birthday) #

#方法二


												

python--面向对象:类和对象命名空间的更多相关文章

  1. python面向对象(类和对象及三大特性)

    类和对象是什么 创建类 新式类 和 经典类 面向对象三大特性 继承 封装 多态   面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使 ...

  2. python:类与对象命名空间、面对对象的组合用法

    1,类里可以定义两种属性: #静态属性 #静态属性就是直接在类中定义的变量 #动态属性 #动态属性就是定义在类中的方法 class Course: language = ['Chinese']#静态属 ...

  3. python面向对象——类和对象

    一.三大编程范式 编程范式即编程的方法论,标识一种编程风格 三大编程范式: 1.面向过程编程(流水线式) 优点:极大的降低了程序的复杂度 缺点:应用场景固定住了,可扩展性差 2.函数式编程 特点: a ...

  4. python面向对象:类空间,对象空间, 组合

    一. 类空间,对象空间 1. 类空间,对象空间 创建一个类就会创建一个类的名称空间,用来存储类中定义的所有名字,这些名字称为类的属性 而类有两种属性:静态属性和动态属性 静态属性就是直接在类中定义的变 ...

  5. python: 面向对象:类和对象调用类中的变量和方法

    一. 面向对象初识 我们在生活中做事都是面向过程的,前面实现一些基本逻辑功能代码也是用面向过程的语句实现的,后来学了函数,把这些功能又装到了函数里.但用面向过程的方法去写程序,只能实现一个功能,我们要 ...

  6. python学习之老男孩python全栈第九期_day023知识点总结——类和对象命名空间、组合

    一. 类和对象命名空间类里 可以定义两种属性: 1. 静态属性 2. 动态属性 class Course: language = 'Chinese' def __init__(self, teache ...

  7. 1.面向过程编程 2.面向对象编程 3.类和对象 4.python 创建类和对象 如何使用对象 5.属性的查找顺序 6.初始化函数 7.绑定方法 与非绑定方法

    1.面向过程编程 面向过程:一种编程思想在编写代码时 要时刻想着过程这个两个字过程指的是什么? 解决问题的步骤 流程,即第一步干什么 第二步干什么,其目的是将一个复杂的问题,拆分为若干的小的问题,按照 ...

  8. Python之面向对象类和对象

    Python之面向对象类和对象 定义一个类:class 定义类的语法: class Test(object): """ 类里定义一类事物共同的技能. 可以是变量,也可是函 ...

  9. Python初识类与对象

    Python初识类与对象 类与对象 世界观角度分析类与对象 类是一个抽象的概念,而对象是一个实体的存在,对象由类创造而出,每个对象之间互相独立互不影响,一个对象可以同时拥有多个类的方法,实例化就是通过 ...

  10. python的类和对象2(self参数)

    python的类和对象2(self参数) 1.python里面对象的方法都会有self参数,它就相当于C++里面的this指针:绑定方法,据说有了这个参数,Python 再也不会傻傻分不清是哪个对象在 ...

随机推荐

  1. fedora 25重新安装引导

    引导区被其他系统给覆盖了,重新安装引导 grub2-install /dev/sdb GRUB_SAVEDEFAULT=true BIOS grub2-mkconfig -o /boot/grub2/ ...

  2. 【目录】mysql 进阶篇系列

    随笔分类 - mysql 进阶篇系列 mysql 开发进阶篇系列 55 权限与安全(安全事项 ) 摘要: 一. 操作系统层面安全 对于数据库来说,安全很重要,本章将从操作系统和数据库两个层面对mysq ...

  3. spring 中各个配置文件的说明

    (1)pom.xml pom.xml文件是在整个项目下面,该xml的主要作用是:导入框架的jar包及其所依赖的jar包,导入的jar包是写在<dependencies></depen ...

  4. byte为什么要与0xff

    面对带正负号的数,会采用符号扩展,如果原值是正数,则高位补上0:如果原值是负数,高位补1.二进制是计算技术中广泛采用的一种数制.二进制数据是用0和1两个数码来表示的数.当前的计算机系统使用的基本上是二 ...

  5. MyBatis笔记一:GettingStart

    MyBatis笔记一:GettingStart 1.MyBatis优点 我们的工具和各种框架的作用就是为了我们操作数据库简洁,对于一些数据库的工具能帮我们少写一些处理异常等等的代码,但是他们并不是自动 ...

  6. 2018-8-10-win10-uwp-ping

    title author date CreateTime categories win10 uwp ping lindexi 2018-08-10 19:17:19 +0800 2018-2-13 1 ...

  7. 【读书笔记】C/C++程序员面试秘籍

    第一章 C/C++ 程序基础(共12题) 第二章 预处理.const.static.和 sizeof(共27题) 第三章 引用和指针(共39题) 第四章 字符串(共31题) 第五章 位运算与嵌入式编程 ...

  8. secureCRT The remote system refused the connection.解决办法

    使用远程登录工具SecureCRT登陆ubuntu的时候遇到了这个问题: secureCRT The remote system refused the connection 这个问题的原因是是Ubu ...

  9. bzoj4237稻草人

    题意:给你一个田地,问左下角和右上角有稻草人并且内部除了边界都没有稻草人的矩形数. 标程: #include<bits/stdc++.h> using namespace std; int ...

  10. SpringBoot 2.x 使用 JWT(JSON Web Token)

    一.跨域认证遇到的问题 由于多终端的出现,很多的站点通过 web api restful 的形式对外提供服务,采用了前后端分离模式进行开发,因而在身份验证的方式上可能与传统的基于 cookie 的 S ...