python进阶(4):初识面向对象

一切皆对象!

预习:

#仿照正方形类写一个圆形类
class Square:
    def __init__(self,length_of_side):
        self.length_of_side = length_of_side

    def square(self):
        ‘面积‘
        return self.length_of_side * self.length_of_side

    def perimeter(self):
        ‘周长‘
        return self.length_of_side * 4

正方形 = Square(2)
print(正方形.square())
print(正方形.perimeter())

预习题

一、面向过程-->面向对象

面向过程:根据业务逻辑从上到下堆叠代码

函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可

面向对象:对函数进行分类和封装,让开发“更快更好更强...”



二、初始类和对象

python中一切皆为对象,类型的本质就是类,所以你已经使用了很长时间的类了

在python中,用变量表示特征,用函数表示技能,因而具有相同特征和技能的一类事物就是‘类’,对象是则是这一类事物中具体的一个。

1、类

#定义一个人类 class类关键字和定义函数时的def同理
class Person:
    role = ‘person‘
    #role变量 属性—— 静态属性
    def walk(self):
    #self必须写(作用后面会介绍)方法,也叫动态属性
        print("person is walking..."

属性引用(类名.属性)

class Person:
    role = ‘person‘
    def walk(self):
        print("person is walking...")

print(Person.role)  #查看人的role属性
print(Person.walk)  #引用人的走路方法,注意,这里不是在调用

引用

实例化:类名加括号就是实例化,会自动触发__init__函数的运行,可以用它来为每个实例定制自己的特征

语法:对象名 = 类名(参数)

class Person:   #定义一个人类
    role = ‘person‘
    def __init__(self,name):
        self.name = name  # 每一个角色都有自己的昵称;

苍井井 = Person(‘苍井井‘)
小泽泽 = Person(‘小泽泽‘)
#实例化的过程就是类——>对象的过程

实例化

类名()就等于在执行Person.__init__(),执行完__init__()就会返回一个对象。这个对象类似一个字典,存着属于这个人本身的一些属性和方法。

查看属性&调用方法

print(苍井井.name)     #查看对象属性直接 对象名.属性名

self:在实例化时自动将对象/实例本身传给__init__的第参数,必须写可以有别名但不建议用别名

类补充

一:我们定义的类的属性到底存到哪里了?有两种方式查看
dir(类名):查出的是一个名字列表
类名.__dict__:查出的是一个字典,key为属性名,value为属性值

二:特殊的类属性
类名.__name__# 类的名字(字符串)
类名.__doc__# 类的文档字符串
类名.__base__# 类的第一个父类(在讲继承时会讲)
类名.__bases__# 类所有父类构成的元组(在讲继承时会讲)
类名.__dict__# 类的字典属性
类名.__module__# 类定义所在的模块
类名.__class__# 实例对应的类(仅新式类中)

类属性的补充

2、对象

我们来写一个人狗大战:现在我们需要对我们的类做出一点点改变。人类除了可以走路之外应该具备一些攻击技能

class Person:  # 定义一个人类
    role = ‘person‘  # 人的角色属性都是人
    def __init__(self, name, aggressivity, life_value):
        self.name = name  # 每一个角色都有自己的昵称;
        self.aggressivity = aggressivity  # 每一个角色都有自己的攻击力;
        self.life_value = life_value  # 每一个角色都有自己的生命值;
    def attack(self,dog):
        # 人可以攻击狗,这里的狗也是一个对象。
        dog.life_value -= self.aggressivity
        print("{0}打了{1}一下,{1}剩余血量{2}".format(self.name, dog.name, dog.life_value))

人类

对象是关于类而实际存在的一个例子,即实例。对象/实例只有一种作用:属性引用

苍井井 = Person(‘苍井井‘,10,1000)
print(苍井井.name)
print(苍井井.aggressivity)
print(苍井井.life_value)

你也可以引用一个方法,因为方法也是一个属性(动态属性)。

class 类名:
    类属性 = None
    def __init__(self,参数1,参数2):
        self.对象的属性1 = 参数1
        self.对象的属性2 = 参数2

    def 方法名(self):pass

    def 方法名2(self):pass

对象名 = 类名(1,2)  #对象就是实例,代表一个具体的东西
                  #类名() : 类名+括号就是实例化一个类,相当于调用了__init__方法
                  #括号里传参数,参数不需要传self,其他与init中的形参一一对应
                  #结果返回一个对象
对象名.对象的属性1   #查看对象的属性,直接用 对象名.属性名 即可
对象名.方法名()     #调用类中的方法,直接用 对象名.方法名() 即可
#对象增加属性
对象.新的属性名 = 1000

小结

对象之间的交互

既然我们要做人狗大战,我们已经有人了,现在我们要再创建一个狗类,狗咬人,我们给狗一个bite方法。有了狗类,我们再实例化一只实实在在的狗出来。人和狗就可以打架了。

class Dog:  # 定义一个狗类
    role = ‘dog‘  # 狗的角色属性都是狗
    def __init__(self, name, breed, aggressivity, life_value):
        self.name = name  # 每一只狗都有自己的昵称;
        self.breed = breed  # 每一只狗都有自己的品种;
        self.aggressivity = aggressivity  # 每一只狗都有自己的攻击力;
        self.life_value = life_value  # 每一只狗都有自己的生命值;
    def bite(self,people):
        # 狗可以咬人,这里的狗也是一个对象。
        people.life_value -= self.aggressivity
        print("{0}咬了{1}一下,{1}剩余血量{2}".format(self.name,people.name,people.life_value))

狗类

实例化一只狼狗:

egon = Dog(‘egon‘,‘狼狗‘,100,20000)  #创造了一只实实在在的狗egon

交互 苍井井 打了 egon 一下/egon 咬了 苍井井 一下

a = Person("苍井井",10,1000)
b = Dog("egon","狼狗",100,20000)
a.attack(b)
b.bite(a)

交互

完整的人狗大战代码:

class Person:  # 定义一个人类
    role = ‘person‘  # 人的角色属性都是人
    def __init__(self, name, aggressivity, life_value):
        self.name = name  # 每一个角色都有自己的昵称;
        self.aggressivity = aggressivity  # 每一个角色都有自己的攻击力;
        self.life_value = life_value  # 每一个角色都有自己的生命值;
    def attack(self,dog):
        # 人可以攻击狗,这里的狗也是一个对象。
        dog.life_value -= self.aggressivity
        print("{0}打了{1}一下,{1}剩余血量{2}".format(self.name, dog.name, dog.life_value))

class Dog:  # 定义一个狗类
    role = ‘dog‘  # 狗的角色属性都是狗
    def __init__(self, name, breed, aggressivity, life_value):
        self.name = name  # 每一只狗都有自己的昵称;
        self.breed = breed  # 每一只狗都有自己的品种;
        self.aggressivity = aggressivity  # 每一只狗都有自己的攻击力;
        self.life_value = life_value  # 每一只狗都有自己的生命值;
    def bite(self,people):
        # 狗可以咬人,这里的狗也是一个对象。
        people.life_value -= self.aggressivity
        print("{0}咬了{1}一下,{1}剩余血量{2}".format(self.name,people.name,people.life_value))

a = Person("苍井井",10,1000)
b = Dog("egon","狼狗",200,20000)
while True :
    a.attack(b)
    b.bite(a)
    if a.life_value <= 0 :
        print(a.name+"被"+b.name+"咬死了!")
        break
    if b.life_value <= 0 :
        print(b.name + "被" + a.name + "咬死了!")
        break

egon大战苍井井



三、类命名空间与对象、实例的命名空间

创建一个类就会创建一个类的名称空间,用来存储类中定义的所有名字,这些名字称为类的属性

静态属性就是直接在类中定义的变量,动态属性就是定义在类中的方法

其中类的数据属性是共享给所有对象的

print(id(a.role))
print(id(Person.role))  #相同

而类的动态属性是绑定到所有对象的

print(a.attack)
print(Person.attack)  #不同

创建一个对象/实例就会创建一个对象/实例的名称空间,存放对象/实例的名字,称为对象/实例的属性,在obj.name会先从obj自己的名称空间里找name,找不到则去类中找,类也找不到就找父类...最后都找不到就抛出异常



四、面向对象的组合用法

组合指的是,在一个类中以另外一个类的对象作为数据属性,称为类的组合

class Weapon:
    ‘‘‘
        这是一个游戏里武器的数据类型
    ‘‘‘
    def __init__(self,name, price, aggrev, life_value):
        self.name = name    #武器名称
        self.price = price  #武器价格
        self.aggrev = aggrev    #武器伤害加成
        self.life_value = life_value    #武器血量加成

    def update(self, obj):  #obj就是要带这个装备的人
        obj.money -= self.price  # 用这个武器的人花钱买所以对应的钱要减少
        obj.aggressivity += self.aggrev  # 带上这个装备可以让人增加攻击
        obj.life_value += self.life_value  # 带上这个装备可以让人增加生命值

    def prick(self, obj):  # 这是该装备的主动技能,绞龙
        obj.life_value -= 3000  # 假设攻击力是3000

武器类

组合交互人狗大战完整代码:

class Person:  # 定义一个人类
    ‘‘‘
        这是一个游戏里人物的数据类型
    ‘‘‘
    role = ‘person‘  # 人的角色属性都是人
    def __init__(self, name, aggressivity, life_value):
        self.name = name  # 每一个角色都有自己的昵称;
        self.aggressivity = aggressivity  # 每一个角色都有自己的攻击力;
        self.life_value = life_value  # 每一个角色都有自己的生命值;
    def attack(self,dog):
        # 人可以攻击狗,这里的狗也是一个对象。
        dog.life_value -= self.aggressivity
        print("{0}打了{1}一下,{1}剩余血量{2}".format(self.name, dog.name, dog.life_value))

class Dog:  # 定义一个狗类
    ‘‘‘
        这是一个游戏里狗的数据类型
    ‘‘‘
    role = ‘dog‘  # 狗的角色属性都是狗
    def __init__(self, name, breed, aggressivity, life_value):
        self.name = name  # 每一只狗都有自己的昵称;
        self.breed = breed  # 每一只狗都有自己的品种;
        self.aggressivity = aggressivity  # 每一只狗都有自己的攻击力;
        self.life_value = life_value  # 每一只狗都有自己的生命值;
    def bite(self,people):
        # 狗可以咬人,这里的狗也是一个对象。
        people.life_value -= self.aggressivity
        print("{0}咬了{1}一下,{1}剩余血量{2}".format(self.name,people.name,people.life_value))

class Weapon:
    ‘‘‘
        这是一个游戏里武器的数据类型
    ‘‘‘
    def __init__(self,name, price, aggrev, life_value):
        self.name = name    #武器名称
        self.price = price  #武器价格
        self.aggrev = aggrev    #武器伤害加成
        self.life_value = life_value    #武器血量加成

    def update(self, obj):  #obj就是要带这个装备的人
        obj.money -= self.price  # 用这个武器的人花钱买所以对应的钱要减少
        obj.aggressivity += self.aggrev  # 带上这个装备可以让人增加攻击
        obj.life_value += self.life_value  # 带上这个装备可以让人增加生命值

    def prick(self, obj):  # 这是该装备的主动技能,绞龙
        obj.life_value -= 3000  # 假设攻击力是3000
        print("{0}发动主动技:蛟龙==>{1}剩余血量{2}".format(self.name, obj.name, obj.life_value))

a = Person("苍井井",10,1000)
b = Dog("egon","狼狗",200,20000)
c = Weapon("蛟龙鞭",1000,40,2000)
a.money = 2000

#判断是否买的起武器
if a.money > c.price :
    c.update(a)
    a.weapon = c

#大战开始
while True :
    a.attack(b)
    if b.life_value <= 0 :
        print(b.name + "被" + a.name + "打死了!")
        break
    a.weapon.prick(b)
    if b.life_value <= 0 :
        print(b.name + "被" + a.name + "绞死了!")
        break
    b.bite(a)
    if a.life_value <= 0 :
        print(a.name+"被"+b.name+"咬死了!")
        break

egon大战苍井井升级版

思维导图:

预习答案:

#圆形类
class Circle:
    def __init__(self,radius):
        self.radius = radius

    def area(self):
        ‘面积‘
        return self.radius **2  * 3.14

    def perimeter(self):
        ‘周长‘
        return self.radius * 2 *3.14

圆 = Circle(8)
print(圆.area())
print(圆.perimeter())

预习答案

时间: 2024-10-18 23:38:37

python进阶(4):初识面向对象的相关文章

Python进阶(十六)----面向对象之~封装,多态,鸭子模型,super原理(单继承原理,多继承原理)

Python进阶(十六)----面向对象之~封装,多态,鸭子模型,super原理(单继承原理,多继承原理) 一丶封装 , 多态 封装: ? ? ? ? ? ?将一些东西封装到一个地方,你还可以取出来 ? ? ? ? ? ?类设置静态属性, 设置一些方法 或者 对象, 对象可以在其对象封装一些属性 多态: ? ? ? ? ? ?python默认支持多态, 多态指的是一种事务具有多种形态 ? ? ? ? ? ?1.多态可以增加代码的灵活度: ? ? ? ? ? ?2.以继承和重写父类方法为前提: ?

Python进阶学习之面向对象

目录 面向对象 私有属性 面向对象 ? python也有面向对象的编程,它与C++中的类有点相似.它也只是运算符重载,继承. class Test: num=0 def __init__(self): # self.num=9 #print结果是9 Test.num=10 #print结果是10 t=Test() print(t.num) 但是在python中类中的变量全是共有的,可以通过Test.num来进行访问:在类中,初始化的构造函数并不是以Test()[Test()方法是C++中的构造函

Python之路——初识面向对象

类的声明 1 def functionName(args): 2 '函数文档字符串' 3 函数体 1 class Person: #定义一个人类 2 role = 'person' #人的角色属性都是人 3 def walk(self): #人都可以走路,也就是有一个走路方法,也叫动态属性 4 print("person is walking...") 类的作用 属性引用 实例化:类名加括号就是实例化,会自动触发__init__函数的运行, 可以用它来为每个实例定制自己的特征 1 cl

python进阶三(面向对象编程基础)【3-1 python中创建类属型】

python中创建类属性 类是模板,而实例则是根据类创建的对象. 绑定在一个实例上的属性不会影响其他实例,但是,类本身也是一个对象,如果在类上绑定一个属性,则所有实例都可以访问类的属性,并且,所有实例访问的类属性都是同一个!也就是说,实例属性每个实例各自拥有,互相独立,而类属性有且只有一份. 定义类属性可以直接在 class 中定义: 1 class Person(object): 2 address = 'Earth' 3 def __init__(self, name): 4 self.na

python进阶三(面向对象编程基础)【3-4 python中定义类方法】

python中定义类方法 和属性类似,方法也分实例方法和类方法. 在class中定义的全部是实例方法,实例方法第一个参数 self 是实例本身. 要在class中定义类方法,需要这么写: 1 class Person(object): 2 count = 0 3 @classmethod 4 def how_many(cls): 5 return cls.count 6 def __init__(self, name): 7 self.name = name 8 Person.count = P

python进阶三(面向对象编程基础)【3-3 python中定义实例方法】

python中定义实例方法 一个实例的私有属性就是以__开头的属性,无法被外部访问,那这些属性定义有什么用? 虽然私有属性无法从外部访问,但是,从类的内部是可以访问的.除了可以定义实例的属性外,还可以定义实例的方法. 实例的方法就是在类中定义的函数,它的第一个参数永远是 self,指向调用该方法的实例本身,其他参数和一个普通函数是完全一样的: 1 class Person(object): 2 3 def __init__(self, name): 4 self.__name = name 5

Python进阶三:面向对象基础

初始化实例属性:输入关键字信息attr='attr1'可以用kw.iteritems() class Person(object): def __init__(self,name,gender,birth,**kw): self.name=name self.gender=gender self.birth=birth for k,v in kw.iteritems(): setattr(self,k,v) xiaoming = Person('Xiao Ming', 'Male', '1990

Python进阶 函数式编程和面向对象编程等

函数式编程 函数:function 函数式:functional,一种编程范式.函数式编程是一种抽象计算机的编程模式. 函数!= 函数式(如计算!=计算机) 如下是不同语言的抽象 层次不同 高阶函数:能接收函数做参数的函数 变量可以指向函数 函数的参数可以接收变量 一个函数可以接收另一个函数作为参数 例子: 接收abs函数, 定义一个函数,接收x,y,z三个参数.其中x,y是数值,z是函数 . 1 2 3 def add(x,y,z):     return z(x)+z(y) print ad

8、python全栈之路-初识面向对象

八.初识面向对象 http://www.cnblogs.com/Eva-J/articles/7293890.html#_label1 1.楔子 #面向对象编程 #面向对象的思想 #对象就是一个实实在在的,可以准确描述出来的实体,比如说egg,alex #面向对象的编程是一种上帝视角的切换 #之前你使用的面向过程的编程是面向结果去编程,一个流水线下来有固定的结果 #好想  可扩展性差 容易引起代码的安全问题 #面向对象 #类:具有相同属性和方法的一类事物 #对象:具有具体的属性的事物 2.初识类

python 初识面向对象

一.初识面向对象 面向过程的程序设计的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. 优点是:极大的降低了写程序的复杂度,只需要顺着要执行的步骤,堆叠代码即可. 缺点是:一套流水线或者流程就是用来解决一个问题,代码牵一发而动全身. 应用场景:一旦完成基本很少改变的场景,著名的例子有Linux內核,git,以及Apache HTTP Server等. 面向对象的程序设计的核心是对象(上帝式思维),要理解对象为何物,必须把自