zoukankan      html  css  js  c++  java
  • ~~核心编程(二):面向对象——类&属性~~

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

    老张…

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


    *走的太快,就要停下来等等灵魂!*
    *学的太快,就要停下来慢慢复习!*
  • 相关阅读:
    linux 命令——19 find (转)
    linux 命令——18 locate (转)
    linux 命令——17 whereis(转)
    linux 命令——16 which(转)
    linux 命令——15 tail (转)
    linux 命令——14 head (转)
    Java for LeetCode 038 Count and Say
    Java for LeetCode 037 Sudoku Solver
    Java for LeetCode 036 Valid Sudoku
    Java for LeetCode 035 Search Insert Position
  • 原文地址:https://www.cnblogs.com/jevious/p/11186821.html
Copyright © 2011-2022 走看看