博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
类中代码执行顺序 及 组合
阅读量:5253 次
发布时间:2019-06-14

本文共 3271 字,大约阅读时间需要 10 分钟。

一  类的名称空间:

  类中的代码在什么时候执行的?  在实例化之前,也就是说在创建一个类时,类自己先给自己创建

建一块空间,也就是公共的空间.(里面会把静态变量和__init__及方法方进去)

类中代码执行顺序:(在实例化之前就执行了)

问题:一个类中可不可以没有__init__? , 在没有的情况下实例化经历了哪些步骤

答案: 可以 ,  (1,创建一个空间给对象,将这个空间的地址返回)

class A:#     Country = 'China'  #静态属性#     def __init__(self,name):#         self.name = name#     def talk(self):#         print('%s is talking'%self.name)

上代码中: A.Country='abc'  # 修改静态属性 将其改为'abc'

    del  A.Country  # 删除静态属性 此时打印会报错

    print(A.__dict__)  # 查看静态属性 

类的名称空间中有什么?

   静态属性和动态属性(方法)

2 对象的命名空间和类的命名空间之间的关系:

  对象和类之间有一个单向的联系,类对象指针

  对象在使用某个名字的时候,先在自己空间里找,没有就会去类空间去找.

 

class A:#     Country = 'China'#     def __init__(self,name):#         self.name = name#     def talk(self):#         print('%s is talking'%self.name)## alex = A('alex')# baoyuan = A('baoyuan')# print(alex.Country)   # 'China' # 用的是静态属性自己里没有找的类的# alex.Country = '泰国'  # 自己创建了个Country属性 名为泰国# print(alex.Country)   # '泰国' 自己的# del alex.Country         # 删除自己的属性# print(alex.Country)   # 'China'  # 又找的类的# print(A.Country)       # china  # 静态属性类的# print(baoyuan.Country) # china # 也是用的类的

因此 对象可以查看类的静态属性,但不能修改(修改相当于给自己创建了一个,此时你要想再用类中的

静态方法,除非删除刚刚创建的),所以静态属性的修改,都应该用类名来完成.

 因此得出 :  静态属性就是用来描述所有对象都共同的某一个值. 

小例子:

#  class People:     money = 1000#      def salary(self):#         People.money += 1000 # 这里只能用类名去修改他 ,如果用对象自己那相当于私房钱了                     没有汇总 # mother = People()# father = People()# mother.salary()# father.salary()# print(People.money,mother.money,father.money)

静态属性 再看一个例子:

class B:#     l = []#     def __init__(self,name):#         self.l.append(name)  # self.l=[name] 下面所说的第三种情况## alex = B('alex')# baoyuan = B('宝元')# print(B.l) #['alex', '宝元']# print(alex.l)# print(baoyuan.l
1 如果静态变量是一个不可变数据类型,那么只要对象修改这个数据,就相当于在对象的空间中新建
2 如果静态变量是一个可变数据类型,那么对象修改这个容器中的元素,相当于修改类的空间中的元素
3 如果静态变量是一个可变数据类型,那么对象直接对这个变量重新赋值,相当于修改对象自己空间中的元素
大结论 # 只要是静态变量,就用类名去修改,永远修改成功,并且所有的对象都共享这个改变
# 总结 # 对象的命名空间:类指针\对象的所有属性 # 类的命名空间:方法和(静态属性\字段) # 对象在寻找名字的时候 : 先找对象自己内存空间中的,找不到就去类的命名空间中寻找 # 类中的名字是什么时候写入内存的 : 代码从上到下执行的时候就已经写入的.一定是在实例化之前 # 静态变量 : 尽量用类名去操作
二 组合(一个类对象的属性是另外一个类的对象) 先说下组合的特点:
  组合指得是,在一个类中以另一个类的对象作为数据属性,称为组合   作用是可以将两个本来不相关的类联系起来,一般两个类之间有显著的不同,很多时候还要附属关系(有相同的属性也有不同的属性   ).比如人和头,手机和电池等   无纵向关系时用组合,有纵向关系用继承   组合就是一个类中使用另一个类,从而把几个类拼到一起,也为了减少代码
看两个例子吧:  1(这是算一个圆环的面积和其周长)     
from math import pi    # 数学模块 用到  πclass Yuan:    def __init__(self,r):        self.r=r    def mianji1(self):        return pi *self.r**2    def zhouchang(self):        return 2*pi*self.rclass Huan:    def __init__(self,R,r):        a=Yuan(R)        b=Yuan(r)        self.a=a        self.b=b    def mianji(self):        return self.a.mianji1()-self.b.mianji1()  # 相当于调了上个类的对象 让他去执行    def zhouchang(self):        return  self.a.zhouchang()+self.b.zhouchang()zo=Huan(6,2)print(zo.mianji())print(zo.zhouchang())  # 总体来说 把下面的参数传给上一个对象,让他去计算下面只要个结果,可以这么理解(上面是专门 做复杂运算的,我把参数直接传给上面让其帮我运算) # 一个类对象的属性是另类的对象

例子2 

年月日的类

student类

class Birthday: # 生日类    def __init__(self,yaer,moth,day): # 生日信息        self.yaer=yaer        self.moth=moth        self.day=day# a=Birthday()class Student: # 学生类    def __init__(self,name,sex,birthday):        self.name=name        self.sex=sex        self.birthday=birthdaybirthday=Birthday(1991,2,2)b=Student('张三','不详',birthday)print(b.birthday.yaer)

 

 

 

转载于:https://www.cnblogs.com/systemsystem/p/9992840.html

你可能感兴趣的文章
c# 文件笔记
查看>>
第一页 - 工具的使用(webstorm)
查看>>
Linux 进程资源用量监控和按用户设置进程限制
查看>>
IE浏览器整页截屏程序(二)
查看>>
D3.js 之 d3-shap 简介(转)
查看>>
制作满天星空
查看>>
类和结构
查看>>
CSS3选择器(二)之属性选择器
查看>>
adidas crazylight 2018 performance analysis review
查看>>
this指向--取自追梦子的文章
查看>>
[javascript] js实现小数的算术运算方法
查看>>
VisualVM使用Jstatd和JMX远程监控配置(转载)
查看>>
azkaban
查看>>
W25Q32的使用
查看>>
mysql保存不了4字节的问题(也就是表情)
查看>>
初始篇------软件测试和质量保证
查看>>
跨平台的 .NET 运行环境 Mono 3.2 新特性
查看>>
Visual Studio跨平台开发Xamarin
查看>>
Buffer对象的总结
查看>>
【原创】谈谈怎么做服务隔离
查看>>