Python 第八章 对象(object)

-对象是内存中专门用来存储数据的区域。对象中可以用来存储各种各样的数据(比如数字,布尔值,代码)

-对象有三部分组成:

1.对象的id标识

2.对象的type类型

3.对象的value值

-面向对象(oop)

-python是一门面向对象的语言,所谓面向对象语言就是语言中所有操作都是通过对象来进行。

-面向过程的编程语言

        -指我们将程序的逻辑分解为一个一个的步骤,通过对每个步骤的抽象来完成程序。

        -面向过程的编程思想将一个功能分解为一个一个小的步骤。这种编程方式符合人类思维,编写起来相对简单,
        -我们通过完成一个一个的小的步骤来完成一个程序,但是这种方式编写的代码往往只适用于一个功能,如果要在实现别的功能,即使功能相差极小,也往往要重新编写,所以可复用性比较低并难维护。

-面向对象的编程语言

        -关注的是对象而不是过程。

        -对于面向对象语言来说一切皆是对象。它将所有的功能统一保存到对应的对象中。要使用某个功能,直接找到对应的对象即可。这种方式编写的代码,易于阅读,易于维护,容易复用。

        -但这种方式编写不太符合常规思维。编写起来稍微麻烦。

总结:

面向对象的思想:

  1. 找对象
  2. 搞对象

-类(class)

我们目前学习的对象都是python内置的对象。但是内置对象不能满足所有需求,所以经常在开发中需要自定义一些对象。

在程序中需要根据类来创建对象。对象是类的实例(instance)。

如果多个对象是通过一个类创建,我们称这些对象是一类对象。

像int(),float(),bool(),str(),list().....这些都是类

a=int(10) #创建一个int类的实例。等价于a=10

-我们自定义的类需要使用大写字母开头,使用大驼峰命名法来对类命名

使用class关键字来定义类,语法和函数很像!
class 类名(【父类】):
   代码块

class MyClass():
    pass
print(MyClass)

#<class '__main__.MyClass'>
#使用MyClass创建一个对象
mc=MyClass()#使用类来创建对象,就像调用一个函数一样。
#mc是MyClass的一个实例
print(mc) #<__main__.MyClass object at 0x0000016CCE5E36A0>

isinstance()用来检查一个对象是否是一个类的实例
result=isinstance(mc,MyClass)
print(result) #True

类就是一个用来创建对象的对象。

类是type类型的对象,定义类实际上就是定义了一个type类型的对象。

-使用类创建对象的一个流程

-现在我们通过MyClass这个类创建的对象都是一个空对象

-就是对象中实际上什么都没有,相当于是一个空的盒子

-可以向对象中添加变量,对象中的变量称为属性 

语法:对象.属性名 = 属性值

mc.name='swk'
print(mc.name)

结果:
swk

        

-类的定义

-类和对象都是对现实生活中或程序中的内容的抽象;
-实际上所有的事物都有两部分组成:

  1. 数据(属性)
  2. 行为(方法)
class Person:#():
    name='swk'
    def say(a):         #类中定义的函数称为方法,这些方法可以通过该类的所有实例来访问
        print('你好呀!')

#定义两个Person实例
p1=Person()
p2=Person()
print(p1.name)#对象.属性名 的形式进行访问

调用方法
对象.方法名()
方法调用与函数调用的区别:
函数调用时传几个参数就会有几个实参;
但是方法调用会默认传递一个参数,所以方法中至少要定义一个形参。
p1.say()
p2.say()
在类的代码块中可以定义变量和函数
-在类中所定义的变量,将会成为该类所有实例的公共属性。所有该类实例都可以访问这些变量。
-类中定义的函数称为方法,函数会成为该类实例的公共方法,这些方法可以通过该类的所有实例来访问。

注意:定义方法至少要定义一个形参

-实例为什么能访问到类中的属性和方法?

        类中定义的属性和方法都是公共的,该类的所有实例都可以来访问。

-属性和方法的查找流程

        当我们调用一个对象的属性时,解析器会先在当前对象中寻找是否含有该属性,

        如果有则直接返回当前的对象的属性值;

        如果没有,则去当前对象的类对象中去寻找,如果有则返回类对象的属性值,如果没有则报错!

-类对象和实例对象都可以保存属性(方法 )

        -如果这个属性(方法)是所有实例共享的,则应该将其保存到类对象中。

        -如果这个属性(方法)是某个实例独有的,则应该保存到实例对象中。

一般情况下,属性保存到实例对象中。而方法需要保存到类对象中。

class Person:#():
    name='swk'
    def say(self):
        方法每次被调用时,解析器都会自动传递第一个实参.
        第一个参数就是调用方法的对象本身,如果是p1调的,则第一个参数就是p1对象
        如果是p2调的,则第一个参数就是p2对象。
        一般将这个参数命名为selt
        在方法中不可以直接访问类中的属性name,看不到!
       #print(self)
        print('你好呀!%s'%self.name)

#定义两个Person实例
p1=Person()
p2=Person()
p1.name='猪八戒'
p2.name='沙和尚'
#print(p1.name)

p1.say()
p2.say()

结果:
你好呀!猪八戒
你好呀!沙和尚

-类的特殊方法init(魔术方法)
  特殊方法以_开头_结尾的方法

 

init可以用来向新创建的对象中初始化属性。

#学习特殊方法:1.特殊方法什么时候调用2.特殊方法有什么作用

class Person:
    print('类中代码块')

    def __init__(self,n):     #通过self向新建的对象中初始化属性
        self.name=n           #在实例对象中创建属性不是类中的公共属性

    特殊的方法会在特殊的时刻自动调用
    #学习特殊方法:1.特殊方法什么时候调用2.特殊方法有什么作用
    #创建对象的流程:
    #p1=person()的运行流程
    1.创建变量
    2.在内存中创建一个新对象
    3.执行类中代码块中的代码(只在类定义的时候执行一次)
    4._init_(self)方法执行
    5.将对象的id赋值给变量

    #_init_()会在对象创建以后就执行
    
    def say(self):
        print('你好呀!%s'%self.name)


p1=Person('孙悟空')传参数给n

#p1.name='孙悟空'
#手动添加name属性

#p1.__init__()特殊方法不需要我们自己调用,也不要尝试去调用特殊方法。
p1.say()
print(p1.name)

结果:
类中代码块
你好呀!孙悟空
孙悟空

#调用类创建对象时,类后面的所有参数都会依次传递到init()中,self是解析器自己传的,init中需要几个参数,我们在创建对象是就要传几个参数,除了self

##类的基本结构

class 类名(【父类】):
    公共属性...

    #对象的初始化方法
    def _init_(self,...):
        ...

    #其他方法
    def method_1(self,...):
        ...

    def method_2(self,...):
        ...
    
    ...

#尝试自定义一个狗的类Dog,属性:name age gender height ...方法:jiao() yao() run()...

class Dog():
    '''
    表示狗的类
    '''
#尝试自定义一个狗的类Dog,属性:name age gender ...方法:jiao() yao() run()...
    def __init__(self,a,b,c):   #通过self向新建的对象中初始化属性
        self.name=a
        self.age=b
        self.gender=c   #在实例对象中
    
    #_init_()会在对象创建以后就执行
    def jiao(self):
        print('%s会叫'%self.name)
    def yao(self):
        print('%s会咬人'%self.name)
    def run(self):
        print('%s会跑'%self.name)


p1=Dog('柯基',1,'man')
#手动添加name属性
p1.name='阿黄'
#目前我们可以直接通过对象.属性的方式来修改属性的值,这种方式导致对象中的属性可以随意修改,
#非常不安全,因为值可以任意修改,不论对错。
#p1.__init__()特殊方法不需要我们自己调用,也不要尝试去调用特殊方法。

p1.jiao()
print(p1.name,p1.age,p1.gender)


结果:
阿黄会叫
阿黄 1 man

#现在我们需要一种方式来增强数据的安全性,
# 一数据不能随意修改,我让你改才能改,不让你改,你就不能改,
# 二属性不能修改为任意的值(年龄不能是负数)
 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不会是小张吧!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值