zoukankan      html  css  js  c++  java
  • Python之旅.第五章.面向对象

    一、类与对象

    类的定义

    class OldboyStudent:

        # 用变量表示特征

        school="Oldboy"

     

        def __init__(self,name,age,sex): #self=stu1     name= "马冬梅"   age=18     sex="female"

            self.name=name # stu1.name = "马冬梅"

            self.age=age  # stu1.age = 18

            self.sex=sex  # stu1.sex = "female"

     

        #  用函数表示技能

        def learn(self):

            print('is learning...',self)

     

        def choose(self):

            print('choose course...')

     

    stu1=OldboyStudent()

    stu1.NAME='马冬梅'

    stu1.AGE=18

    stu1.SEX="female"

     

    print(stu1.NAME,stu1.school)

    #以上方法是在产生对象之后方能为对象增加属性,而实际情况更多的是希望在产生对象的过程中为对象增加属性

     

    调用类发生哪些事:

    1、首先会产生一个空对象stu1

    2、会自动触发类内部的__init__函数

    3、然后将空对象stu1连同调用类时括号内的参数组成(stu1,"马冬梅",18,'female',将这四个参数一起传给__init__函数

     

    stu1=OldboyStudent("马冬梅",18,'female')  #OldboyStudent.__init__(stu1,"马冬梅",18,'female')

    stu2=OldboyStudent("甜蜜蜜",21,'male') #OldboyStudent.__init__(stu2,"甜蜜蜜",21,'male')

    stu3=OldboyStudent("原石开",22,'male')

     

    print(stu1.name,stu1.age,stu1.sex)

    # .左边一定是一个名称空间。.右边是属性

     

    二、对象的使用

    school='xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'

    class OldboyStudent:

        school='oldboy'

     

        def __init__(self,name,age,sex):

            self.name=name

            self.age=age

            self.sex=sex

     

        def learn(self):

            print('%s is learning' %self.name)

     

        def choose(self,course):

            print('%s is choosing %s' %(self.name,course))

     

    调用类---》产生类的对象,该对象也可以称为类的一个实例,调用类的过程也称为类的实例化

    stu1=OldboyStudent('李三胖',18,'male') #OldboyStudent.__init__(stu1,'李三胖',18,'male')

    stu2=OldboyStudent('王大炮',28,'male')

     

    先在对象的名称空间中查找,若查不到接着去类的名称空间中查找,若依然查不到则报错,不会去全局名称空间中查找。

    print(stu1.school)  #但前缀,只在对象及类的名称空间查找

    print(school)  #不带前缀,查的是全局名称空间中的名字

     

    类内部定义的变量是给所有对象共享,所有对象指向的都是同一个内存地址

    print(id(stu1.school))

    print(id(stu2.school))

    print(id(OldboyStudent.school))   #以上三者的id一致

     

    类内部定义的函数,类可以使用,但类来用的时候就是一个普通函数,普通函数有几个参就传几个参数

    print(OldboyStudent.learn)

    OldboyStudent.learn(123)

     

    类内部定义的函数,其实是给对象使用的,而且是绑定给对象用,绑定给不同的对象就是不同的绑定方法(bound method)

    print(stu1.learn)

    print(stu2.learn)

    绑定方法的特殊之处在于,谁来调用,就会将谁当作第一个参数自动传入

     

    三、一切皆对象

    class OldboyStudent:

        school='oldboy'

     

        def __init__(self,name,age,sex):

            self.name=name

            self.age=age

            self.sex=sex

     

        def learn(self):

            print('%s is learning' %self.name)

     

        def choose(self,course):

            print('%s is choosing %s' %(self.name,course))

     

    stu2=OldboyStudent('王大炮',28,'male')

     

    print(id(stu2))

    print(type(stu2)) # 类与类型是一个概念(python3中,统一了类与类型的概念)

     

    l1=[1,2,3] #l1=list([1,2,3])

    print(type(l1))  # class list

    l1.append(4) #list.append(l1,4)

    print(l1)

     

    l2=['a','b','c']

    l2.append('d') # list.append('d')

    print(l2)

     

    print(int)

    print(str)

    print(dict)

    print(tuple)

    print(set)

    print(OldboyStudent)

     

    四、小练习

    class Foo:

        n=0

        def __init__(self):

            Foo.n+=1 # Foo.n=3   #必须用Foo,否则不共享

     

    增删改查

    class Bar:

        n=1111111111

        def __init__(self,x):

            self.x=x

     

    obj=Bar(111)

    print(obj.__dict__)

    print(obj.n)

    obj.y=2

    obj.n=3

    print(obj.__dict__)

    print(obj.n)

    obj.x=123

    del obj.x

    print(obj.x)

     

    人狗大战

    class People:

        def __init__(self, name, aggresivity, life_value=100):

            self.name = name

            self.aggresivity = aggresivity

            self.life_value = life_value

     

        def bite(self, enemy): #self=p1   enemy=d1

            enemy.life_value-=self.aggresivity

            print("""

            [%s] 咬了一口狗 [%s]

            狗掉血[%s]

            狗还剩血量[%s]

            """ %(self.name,enemy.name,self.aggresivity,enemy.life_value)

            )

     

    class Dog:

        def __init__(self, name, dog_type, aggresivity, life_value):

            self.name = name

            self.dog_type = dog_type

            self.aggresivity = aggresivity

            self.life_value = life_value

     

        def bite(self, enemy): #self = d1    enemy= p1

            enemy.life_value-=self.aggresivity

            print("""

            [%s] 咬了一口人 [%s]

            人掉血[%s]

            人还剩血量[%s]

            """ %(self.name,enemy.name,self.aggresivity,enemy.life_value)

            )

     

    p1 = People('刘清政', 60)

    d1=Dog('李杰',"藏獒",200,200)

     

    p1.bite(d1)

    d1.bite(p1)

     

    总结:

    一、类的实例化:调用类产生对象的过程称为类的实例化,实例化的结果是一个对象,或称为一个实例

    class People:

        def __init__(self,name,age,sex):

            self.name=name

            self.age=age

            self.sex=sex

     

        def run(self):

            print('%s is running' %self.name)

     

    实例化做了三件事

    1、先产生一个空对象

    2、自动触发类内部__init__函数的执行

    3、将空对象,以及调用类括号内传入的参数,一同传给__init__,为对象定制独有的属性

    obj=People('egon',18,'male') #People.__init__(obj,'egon',18,'male')

     

    会产生对象的名称空间,如何查看

    print(obj.__dict__)

     

    二;对象的操作

    print(obj.name) #obj.__dict__

    obj.education='哈佛'

    del obj.name

    obj.age=19

    print(obj.__dict__)

     

     

    三:对象属性的查找顺序:先找对象自己的名称空间----》类的名称空间

    class People:

        x=1

        def __init__(self,name,age,sex):

            self.name=name

            self.age=age

            self.sex=sex

     

        def run(self): #self=obj

            print('%s is running' %self.name) #obj.name

     

    obj=People('egon',18,'male') #People.__init__(obj,'egon',18,'male')

    obj1=People('egon1',18,'male') #People.__init__(obj,'egon',18,'male')

    obj2=People('egon2',18,'male') #People.__init__(obj,'egon',18,'male')

     

    1、类的数据属性:是给对象用的,而且直接共享给所有对象用的,内存地址都一样

    print(People.x)

    People.x=11111

     

    print(id(People.x),People.x)

    obj.x='obj================'

    print(id(obj.x),obj.x)

    print(id(obj1.x),obj1.x)

    print(id(obj2.x),obj2.x)

     

     

    2、类的函数属性:也是给对象用,但是绑定给对象用的,绑定到不同的对象就是不同的

    绑定方法,内存地址都不一样,但其实只想都是同一个功能

    print(People.run) #<function People.run at 0x00000226E7C78A60>

    People.run(123123)

    People.run(obj)

     

    print(obj.run)

    print(obj1.run)

    print(obj2.run)

     

    四:绑定方法的特殊之处:

    1 绑定给谁就应该由谁来调用,

    2、谁来调用就会把谁当做第一个参数传入

    class People:

        x=1

        def __init__(self,name,age,sex):

            self.name=name

            self.age=age

            self.sex=sex

     

        def run(self): #self=obj

            print('%s is running' %self.name) #obj.name

     

        def f1():

            print('from f1')

     

        def f2(self):

            pass

     

    obj=People('egon',18,'male') #People.__init__(obj,'egon',18,'male')

    obj1=People('egon1',18,'male') #People.__init__(obj,'egon',18,'male')

    obj2=People('egon2',18,'male') #People.__init__(obj,'egon',18,'male')

     

    obj.run()

    obj1.run()

    obj2.run()

     

    print(People.f1)

    People.f1()

    print(obj.f1)

    obj.f1() #People.f1(obj)

     

     

    五:一切皆对象:python3中统一了类与类型的概念,类即类型

    l=list([1,2,3])

    print(type(l))

    print(type(obj))

    l.append(4)

  • 相关阅读:
    [解决方案] pythonchallenge level 2
    [解决方案] pythonchallenge level 1
    [解决方案] pythonchallenge level 0
    arch安装
    用宏定义封装LoadLibrary,方便的动态加载dll
    windows Api AlphaBlend的使用方法
    如何用ASP.NET实现bosh模拟http双向长连接请求
    一致性哈希算法的研究
    UEFI 引导安装 Windows 8 与 Ubuntu 12.04 双系统
    SAP UI5学习笔记之(十二)虚拟服务器配置-Mock Server Configuration
  • 原文地址:https://www.cnblogs.com/yangli0504/p/8796940.html
Copyright © 2011-2022 走看看