• ~~核心编程(二):面向对象——类&属性~~


    进击の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岁,男,最爱大保健

    老张…

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


    *走的太快,就要停下来等等灵魂!*
    *学的太快,就要停下来慢慢复习!*
  • 相关阅读:
    ntohs, ntohl, htons,htonl的比较和详解
    转 linux socket的select函数例子
    转 结构体中字节对齐问题(转载)
    C语言中volatile关键字的作用
    转 字符串模式匹配算法——BM、Horspool、Sunday、KMP、KR、AC算法
    转 常见hash算法的原理
    转 从头到尾彻底解析Hash表算法
    [CEOI2020 D2T1 / CF1403A] 权力药水The Potion of Great Power 题解
    [CEOI2020 D1T3 / CF1402C] 星际迷航Star Trek 题解
    [CEOI2020 D1T2 / CF1402B] 道路Roads 题解
  • 原文地址:https://www.cnblogs.com/jevious/p/11186821.html
Copyright © 2020-2023  润新知