~~核心编程(一):面向对象——类&私有属性~~

进击の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)

打印一下!不会报错的!



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

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

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

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

还解决了这个 self 的问题

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

怎么拿出来私有属性

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

多练!多打!

试着给人加个私有属性age,sex

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


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

~~核心编程(一):面向对象——类&私有属性~~

原文地址:https://www.cnblogs.com/jevious/p/11186821.html

时间: 2024-07-30 21:58:28

~~核心编程(一):面向对象——类&私有属性~~的相关文章

[有码有真相]python类私有属性等要点理解及测试示例代码

# encoding: utf-8 ''' 1. python约定类定义中"__"开头(至多一个"_"结尾)的属性为"相对"的私有属性 2. 私有属性在类及其子类定义中是"可见"的,在 其它范围正常访问是相对"不可见"的 3. 留下子类可以修改父类私有属性的口子方便debug测试等 4. 在类定义以外可以通过['_'+className+'私有属性名称']名称访问 5. 私有属性引入是避免类,实例等混淆和冲

《Python核心编程》 面向对象编程学习笔记

1. 1. 引言 1. 类与实例 可以定义一个本身没有任何属性的类,而仅把它用做数据的名字空间,这样的类仅作为容器对象来共享名字空间. 示例如下: class MyData(object): pass 下面创建它的实例,它只使用类作为名称空间容器. >>> mathObj = MyData() >>> mathObj.x = 4 >>> mathObj.y = 5 >>> mathObj.x + mathObj.y 9 >>

Python核心编程笔记(类)

Python并不强求你以面向对象的方式编程(与Java不同) # coding=utf8 class FooClass(object): version = 0.1 def __init__(self, nm='John Doe'): self.name = nm print('Created a class instance for', nm) def showname(self): print('Your name is ', self.name) print('My name is ',

Windows核心编程05-窗口类的创建

创建主窗口: 创建主窗口这段代码经常要用到,先存起来 #include "stdafx.h" HINSTANCE g_hInstance = 0; //接收应用程序实例句柄 //主窗口处理函数 LRESULT CALLBACK WndProc(HWND hWnd,UINT nMsg,WPARAM wParam,LPARAM lParam) { switch(nMsg) { case WM_DESTROY: PostQuitMessage(0); break; } return DefW

Windows核心编程05-窗口类的注册

窗口类 窗口类包含了窗口的各种参数信息的数据结构.每个窗口都具有窗口类,基于窗口类创建窗口.每个窗口类都具有一个名称,使用前必须注册到系统. 窗口类的分类 -系统窗口类 系统已经定义好的窗口类,所有应用程序都可以直接使用 -应用程序全局窗口类 由用户自己定义,当前应用程序的所有模块都可以使用 容易产生冗余 -应用程序局部窗口类 由用户自己定义,当前应用程序中本模块可以使用 建议使用这个,局部窗口类可以代替全局窗口类 系统窗口类的注册 不需要注册,直接使用窗口类即可.系统已经定义好相应名称,例如

13 面向对象编程 - 《Python 核心编程》

?? 引言 ?? 面向对象编程 ?? 类 ?? 实例 ?? 绑定与方法调用 ?? 子类,派生和继承 ?? 内建函数 ?? 定制类 ?? 私有性 ?? 授权与包装 ?? 新式类的高级特性 ?? 相关模块 13.1 介绍 在Python 中,面向对象编程主要有两个主题,就是类和类实例 类与实例 如何创建一个类: class MyNewObjectType(bases): 'define MyNewObjectType class' class_suite #类体 关键字是class,紧接着是一个类名

访问类的私有属性(RTTI和模仿类2种方法)

如何访问类的私有属性? 下面以 TPathData 为例,它有一个私有属性 PathData,储存了每一个曲线点,但一般无法修改它,需要利用下面方法,才能访问修改(若有更好的方法,歡迎分享): 一.利用 RTTI 取得类私有属性(建议使用此方法): type TPathDataHelper = class helper for TPathData public function PathData: TList<TPathPoint>; end; function TPathDataHelper

[示例]访问类的私有属性

如何访问类的私有属性? 下面以 TPathData 为例,它有一个私有属性 PathData,储存了每一个曲线点,但一般无法修改它,需要利用下面方法,才能访问修改(若有更好的方法,歡迎分享): 一.利用 RTTI 取得类私有属性(建议使用此方法): type TPathDataHelper = class helper for TPathData public function PathData: TList<TPathPoint>; end; function TPathDataHelper

[.net 面向对象编程基础] (9) 类的成员(字段、属性、方法)

[.net 面向对象编程基础] (9) 类的成员(字段.属性.方法) 前面定义的Person的类,里面的成员包括:字段.属性.方法.事件等,此外,前面说的嵌套类也是类的成员. a.类的成员为分:静态成员(static)和非静态成员 b.静态成员用static标识,不标识则默认为非静态成员 c.静态成员属于类所有,动态成员则属于实例所有,即对象 d.静态成员为类所有实例共享,无论类有多少实例或副本,静态成员只占用存中一块区域.非静态成员则在类的每个实例,都创建一个内存域. 下面主要说明一下类的主要