进击のpython

*****

类&属性


虽然我们上一part写了一个面向对象的程序:人狗大战

但是如果在面向对象来看

你这些的就不够规范

你既然选择用面向对象的思想来写

那你就要符合人家的定义规范和操作流程

那废话不多说

开始整活!

走的太快,就要停下来等等灵魂!


前面是先整出一个模板是吧?

那咱们也写个模板!

按照面向对象的思想来写!

是不是就是模板!(为啥要分两个博客写,就是为了让你对照上一个来看的!)

那就涉及到知识盲区了吧!

class Dog:  # python中,类的书写首字母大写,不写只是不专业
d_kind = "jingba" # 狗(类)的属性 (类变量) def bite(self): # 函数(方法)(self 先把他当作默认变量)
print("我是狗,我的种类是", self.d_kind) # 先记住调用要用self来调用 d = Dog() # 狗(类)的实例化
d1 = Dog() # 狗(类)的实例化 d.bite() # 狗(类)的函数(方法) 实例化.方法
print(d.d_kind) # 狗(类)的属性 实例化.属性

可以不铁汁!两篇文章对照着来看,试着自己写一下人的模板(类)

动手!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

别光看!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

class Person:
p_blod = 100 def beat(self):
print("我是人,我的血量是", self.p_blod)

但是我每个狗的名字不一样,我也想写进去,跟前面一样

怎么办嘛!

首先可以肯定,你不能把d_name这个属性放到class

为什么???

因为class放的是共有属性(大家都用的)

我这个dog做的就是jingba狗的模型

我要是加个名字“zhangsan”

那不就是做了一个都叫zhangsan的jingba狗了吗?

那咋办嘛!

我是不是应该考虑,把这个d_name属性变成私有属性呢?

会吗???

你当然不会啊!

你会我写啥啊!

这里我们用到了个新的好玩的东西

class Dog:  # python中,类的书写首字母大写,不写只是不专业
d_kind = "jingba" # 狗(类)的属性 (类变量) def __init__(self): # 初始化方法,构造方法,构造函数 def bite(self): # 函数(方法)(self 先把他当作默认变量)
print("我是狗,我的种类是", self.d_kind) # 先记住调用要用self来调用

看到中间的那个def __init__(self):没有?

你要是非要纠结self以及为什么是用_来写的,那就点这里!(传送门

点完回来了奥

那我们继续!

def __init__(self):

这个东西是干什么的呢???

他会在你实例化的时候,自动执行,进行一些初始化操作

很重要!记下来!

那怎么用呢?????????

看代码好不?

class Dog:  # python中,类的书写首字母大写,不写只是不专业
d_kind = "jingba" # 狗(类)的属性 (类变量) def __init__(self, name, age): # 初始化方法,构造方法,构造函数
print(f"我的名字是{name},我的年龄是{age}") def bite(self): # 函数(方法)(self 先把他当作默认变量)
print("我是狗,我的种类是", self.d_kind) # 先记住调用要用self来调用

我们把想传进去的参数都放到 def __init__(self): 这个里面

好,形参确定了!怎么传实参呢?

实例化的时候就可以传了!

d = Dog("ponny", 18)

打印没有问题!

但是我又有个想法,我想这么写!

def __init__(self, name, age):
print(f"我的名字是{name},我的年龄是{age}")
def bite(self):
print("我是狗,我的种类是", self.d_kind,name,age)

我想都打印出来,这么写是不是应该可以

但是执行的时候是会报错的

为什么呢?

最起码,这也算是两个函数是吧

当上面的函数执行结束之后

是不是数据就回收了?

我在下面调用是不是就没了??

所以就会报错是不!

那我要怎么把这个数据存起来呢????

这个时候就要讲这个东西了 self

self什么意思??自己的吧

那他这个自己的是什么呢???

其实就是实例化本身!

还记得在上面,我们调用方法的时候是怎么调用的吗?

d = Dog()
d.bite()

对吧,但是你发现这个bite函数是有默认值的啊!

是谁??self!对吧!

那我没传参数怎么没报错呢?(你是不是都没想过这个问题?)

所以说,我们得到了个观点,就是self=d

那d是什么???是不是实例化的对象???

所以!!!!!!self就是实例化的对象!!!!

讲参数的时候说过,默认参数要是不传参,就是默认值是吧!

所以!!!!!!!!!!!!!!!!!!!!!!!!!

d.bite() == d.bite(d)(这种写法是错误的,理解为主!)

好!既然我们知道了 self 就是实例化本身

那我们想要给 zhangsan 狗(实例化)一些私有变量

是不是应该跟 zhangsan 狗绑定?(因为是他自己的属性,所以要绑定啊)

是不是就应该像 zhangsan狗的年龄是18

那是不是就应该是 zhangsan狗.年龄 = 18

那是不是就是 实例化.age = 18

那是不是就是 sellf.age = 18

那我这个18 是不是每个狗不一样

是不是应该放个形式参数?

是不是应该写成 self.age = age

那最后是不是介样婶儿的

    def __init__(self, name, age):
self.name = name
self.age = age
print(f"我的名字是{name},我的年龄是{age}")
# 因为是私有的属性,所以放到__init__这个函数里

好了!放好了!!怎么拿出来呢????

很简单,怎么放的怎么往出拿!

    def bite(self):
print("我是狗,我的种类是", self.d_kind, self.name, self.age)

打印一下!不会报错的!


那我又有问题了!

那我突然又整了个狗sir(实例化一个对象)

但是种类不是jinmao

是erha

我要怎么改呢?

d.d_kind = "erha"

打印一下??没问题

但是有问题啊!

这个d_kind不是共有属性吗?

你改了这个狗sir,那别的狗(zhangsan)不也变了吗?

(试着打印一些别的狗,看看种类是否发生了变化)

结果是没有变!

emm???????

是这样的!

当我执行 d.d_kind = "erha" 这个语句的时候

相当于给我这个狗sir创建了一个新的私有属性

当私有属性和共有属性相同时,我们就选用私有属性的值!


首先我们学会了,如何用面向对象的规则来写代码

类的使用咱们也有点意识了

共有属性和私有属性也知道都是啥了

怎么使用公共属性,怎么调用方法也有点会了

还解决了这个 self 的问题

以此知道了怎么存储私有属性

怎么拿出来私有属性

那这些东西啊,看,是解决不了的(大手子当我没说)

多练!多打!

设计一个类Person,生成若干实例,在终端输出如下信息

小明,10岁,男,上山去砍柴

小明,10岁,男,开车去东北

小明,10岁,男,最爱大保健

老李,90岁,男,上山去砍柴

老李,90岁,男,开车去东北

老李,90岁,男,最爱大保健

老张…

去练练,你的付出会有回报的


*走的太快,就要停下来等等灵魂!*
*学的太快,就要停下来慢慢复习!*

最新文章

  1. Django (2)
  2. Codeforces Round #384 (Div. 2) 734E Vladik and cards
  3. MongoDB replication set副本集(主从复制)(8)(转)
  4. 【caffe】未定义函数或变量caffe_
  5. ArcServer JS API开发离线部署方法
  6. 第十七课:js数据缓存系统的原理
  7. Android AIDL Service
  8. Iaas-cloudstack2
  9. Redis 连接
  10. 文件I/O(不带缓冲)之creat函数
  11. Windows下管理Python安装包
  12. IOS开发创建开发证书及发布App应用(七)——在iTunes创建填写应用基本信息
  13. anaconda spyder异常如何重新启动
  14. Codeforces 791A Bear and Big Brother(暴力枚举,模拟)
  15. [转]FFMpeg框架代码阅读
  16. C++学习8-面向对象编程基础(模板)
  17. Synchronized、lock、volatile、ThreadLocal、原子性总结、Condition
  18. Java之24种设计模式-UML-模型图解读
  19. 通用视图-分开处理GET、POST请求
  20. yaf 笔记(持续更新)

热门文章

  1. SqlServer 可更新订阅升级字段队列数据丢失原因
  2. QSqlQueryModel 居然默认是只读的!
  3. layui打印表格自定义函数
  4. DI 容器实务建议
  5. 可视化流程设计——流程设计器演示(基于Silverlight)
  6. 文件文件夹混合多选对话框(修改GWL_WNDPROC)
  7. Codility--- NumberOfDiscIntersections
  8. [2017.02.23] Java8 函数式编程
  9. 302Java_前定义
  10. Nio编程模型总结