zoukankan      html  css  js  c++  java
  • 二十一. Python基础(21)--Python基础(21)

    二十一. Python基础(21)--Python基础(21)

    1 ● 类的命名空间

    #对于类的静态属性:

        #类.属性: 调用的就是类中的属性

        #对象.属性: 先从自己的内存空间里找名字, 找到了用自己的, 没找到用类的, 如果类中也没有,就报错

    #对于类的动态属性(方法):

        # 这个方法本身就存在类中,并不会存在对象的内存中

        # 如果要通过对象调用类中的方法, 这依赖于 去对象中的一个地址簿去类中寻找对应的方法

    #对于对象的属性:

        # 对象的属性就存在对象的命名空间中

        # 只能被对象调用、修改, 不能被类调用(类内调用: self.属性名; 类外调用: 对象.属性)

    class A:

        country = '印度'

        def __init__(self, name):

            self.name = name

        def show_name(self):

            print(self.name)

     

    A.gender = 'male' # 在类体外定义类属性

    A.country = '中国' # 在类体外修改已有的类属性/静态属性的值()

    a = A("Arroz")

    a.age = 18 # 在类体外定义对象属性

    print(A.country)

    print(a.gender)

    a.show_name()

    '''

    中国

    male

    Arroz

    '''

    for i in A.__dict__.items(): # 打印类属性, 可以看到, 在类体外定义的类属性('gender', 'male')存在于类体中

        print(i, end = " ")

    '''

    ('__module__', '__main__')

    ('country', '中国')

    ('__init__', <function A.__init__ at 0x000000000272A840>)

    ('show_name', <function A.show_name at 0x000000000272A8C8>)

    ('__dict__', <attribute '__dict__' of 'A' objects>)

    ('__weakref__', <attribute '__weakref__' of 'A' objects>)

    ('__doc__', None)

    ('gender', 'male')

    '''

    for i in a.__dict__.items(): # 打印对象属性, 可以看到, 在类体外定义的类属性('age', 18)存在于类体中, 但在类体外定义的对象属性不存在于类体中,

        print(i, end = " ")

    '''

    ('name', 'Arroz')

    ('age', 18)

    '''

     

     

    class A:

        country = '印度'

        def show_name(self):

            print(self.name)

     

    a = A() #实例化对象

    a.name = 'Alex' # 给对象创建一个name属性

    a.show_name() #调用了show_name()方法

    '''

    Alex

    '''

     

    class A:

        country = '印度'

        def show_name(self):

            print(self.name)

     

    a = A()

    a.name = 'Alex'

    a.show_name = 'Egon'

    a.show_name()

    '''

    报错:

    TypeError: 'str' object is not callable

    '''

     

     

    class A:

        country = '印度'

        def show_name(self):

            print(self.name)

     

    a = A()

    b = A()

    print(A.country) # 印度

    print(a.country) # 印度, 先找a对象的内存, 再找类A的内存

    print(b.country) # 印度

    a.country = '中国' # 给a对象创建了一个属性

    print(A.country) # 印度

    print(a.country) # 中国

    print(b.country) # 印度

    # 如果是在C++中, 如果某一个对象修改了静态属性, 其它对象的静态属性(实际上是同一个静态属性)也将改变

     

    2 ● 组合

    组合就是在一个类中以另外一个类的对象作为对象属性

    组合表达的是 什么有什么(A 有 B) 的一种关系, 例如圆环的大环和小环的关系, 教师与课程的关系, ③ 人与生日的关系

    作用: 增强了代码的重用性

    class Dog():

        role = 'dog'

     

        def __init__(self, name, aggressivity, blood):

            self.name = name

            self.aggr = aggressivity

            self.blood = blood

     

        def bite(self, person):

            print('%s bites %s' % (self.name, person.name))

            person.blood -= self.aggr

     

    class Weapon(): # 定义类时, 类体可以是空的, 所以__init__()等属性也不是必须的

        def prick(self, dog):

            dog.blood -= 500

     

    class Person:

        role = 'person'

     

        def __init__(self, name, aggressivity = 200):

            self.name = name

            self.aggr = aggressivity

            self.blood = 20000

            self.weapon = Weapon() # 类的组合

     

        def attack(self, dog):

            print('%s attacks %s'%(self.name, dog.name))

            dog.blood -= self.aggr

     

    egon = Person('Egon') # 攻击力采用默认的200

    alex = Person('Alex', 500) # 重新声明攻击力500

    mica = Dog('Mica', 1000, 3000)

    # mica咬egon

    mica.bite(egon)

    print('egon.blood:', egon.blood)

    # egon反攻mica,, mica减血200, 剩2800

    egon.attack(mica)

    print('mica.blood:', mica.blood)

    print('##################')

    mica.bite(alex)

    # mica咬alex

    print('alex.blood:', alex.blood)

    # alex反攻mica,, mica减血500, 剩2300

    alex.attack(mica)

    print('mica.blood:', mica.blood)

     

  • 相关阅读:
    Qt 动画之QPropertyAnimation
    QT 文件的读写
    keil编译程序出现declaration may not appear after executable statement in block 错误 解决办法
    QT UDP通信接受发送数据
    QT 样式表
    QT 滑动条和滚动条的样式
    C++调用dll例子
    MFC非模态窗口gdi+自绘图片
    获取windows操作系统分辨率(DPI)
    单个循环输出数圈(简单易懂)
  • 原文地址:https://www.cnblogs.com/ArrozZhu/p/8396470.html
Copyright © 2011-2022 走看看