python面向对象及命名空间

初识面向对象

一种新的编程思路

一些概念,一些语法

# 面向过程 : 想要一个结果 写代码 实现计算结果
# 面向对象开发 : 有哪些角色 角色的属性和技能 两个角色之间是如何交互的

# 复杂的 拥有开放式结局的程序 比较适合使用面向对象开发
    # 游戏
    # 购物

  • 类和对象之间的关系?
    • 类:是一个大范围 是一个模子 它约束了事物有哪些属性 但是不能约束具体的值
    • 对象:是一个具体的内容 是模子的产物 它遵循了类的约束 同时给属性赋上具体的值

先来定义模子,用来描述一类事物,具有相同的属性和动作

class Person:  # 类名
    def __init__(self):
        # 必须叫__init__这个名字。不能改变的,所有的在一个具体的人物出现之后拥有的属性
        # 都可以写在这里
        print('_' * 20)
        self.name = 'alex'  # 对象的属性/实例变量
        self.sex = 'man'
        self.job = '搓澡工'
        self.level = 0
        self.hp = 250
        self.weapon = '搓澡巾'
        self.ad = 1
        print('*' * 20)


alex = Person()  # alex 就是对象, alex = Person()的过程 是通过类获取一个对象 - 实例化
wusir = Person()
# 类名加括号会自动调用类中的__init__方法
#Person是一个类:alex,wusir都是这个类的对象
print(alex.__dict__)  # {'name': 'alex', 'sex': 'man', 'job': '搓澡工', 'level': 0, 'hp': 250, 'weapon': '搓澡巾', 'ad': 1}
print(alex)  # <__main__.Person object at 0x00000167DFE481D0>

把属性写活

class Person:  # 类名
    def __init__(self,name,sex,job,hp,weapon,ad):
        self.name = name
        self.sex = sex
        self.job = job
        self.level = 0
        self.hp = hp
        self.weapon = weapon
        self.ad = ad

alex = Person('alex','不详','搓澡工',260,'搓澡巾','1')
print(alex.__dict__)
print(alex)
wusir = Person('wusir','man','法师',5000,'棍',1000)
print(wusir.__dict__)
print(wusir)
'''
{'name': 'alex', 'sex': '不详', 'job': '搓澡工', 'level': 0, 'hp': 260, 'weapon': '搓澡巾', 'ad': '1'}
<__main__.Person object at 0x00000235605426A0>
{'name': 'wusir', 'sex': 'man', 'job': '法师', 'level': 0, 'hp': 5000, 'weapon': '棍', 'ad': 1000}
<__main__.Person object at 0x0000023560542748>
'''

类有一个空间,存储的是定义在class中的所有名字

每一个对象又拥有自己的空间,通过 对象名.__dict__ 就可以查看这个对象的属性和值

  • 属性的查看、修改、增加、删除(增删改查)

    class Person:  # 类名
        def __init__(self,name,sex,job,hp,weapon,ad):
            self.name = name
            self.sex = sex
            self.job = job
            self.level = 0
            self.hp = hp
            self.weapon = weapon
            self.ad = ad
          
    wusir = Person('wusir','man','法师',5000,'棍',1000)
    print(wusir.__dict__)
    #----------查看-----------
    print(wusir.__dict__['job'])  # 简单写法print(wusir.job)
    #法师
    #----------修改-----------
    wusir.job = '战士'
    print(wusir.job)
    #战士
    #----------增加-----------
    wusir.money = 999
    print(wusir.__dict__)
    print(wusir.money)
    #{'name': 'wusir', 'sex': 'man', 'job': '战士', 'level': 0, 'hp': 5000, 'weapon': '棍', 'ad': 1000, 'money': 999}
    #999
    #----------删除-----------
    del wusir.money
    print(wusir.__dict__)
    #{'name': 'wusir', 'sex': 'man', 'job': '战士', 'level': 0, 'hp': 5000, 'weapon': '棍', 'ad': 1000}
    
# 实例化所经历的步骤
    # 1.类名() 之后的第一个事儿 :开辟一块儿内存空间
    # 2.调用 __init__ 把空间的内存地址作为self参数传递到函数内部
    # 3.所有的这一个对象需要使用的属性都需要和self关联起来
    # 4.执行完init中的逻辑之后,self变量会自动的被返回到调用处(发生实例化的地方)

命名空间问题

对象.func1() == 类名.func1(对象)

class A:
    City = '中国'   # 静态变量/静态属性,存储在类的命名空间里
    def __init__(self):  # 绑定方法,存储在类的名称空间里
        pass
    def func1(self):
        pass
    def func2(self):
        pass
    def func3(self):
        pass

a = A()
print(A.City)
a.func1()  # 相当于 A.func1(a)   对象.func1()  ==  类名.func1(对象)
  1. 类中的变量是静态变量
    2.对象中的变量只属于对象本身,每个对象有属于自己的空间来存储对象的变量
    3.当使用对象名去调用某一个属性的时候会优先在自己的空间中寻找,找不到再去对应的类中寻找
    4.如果自己没有就引用类的,如果类也没有就报错
    5.对于类来说,类中的变量所有的对象都是可以读取的,并且读取的是同一份变量

  • 类中的静态变量的用处
    • 如果一个变量是所有对象共享的值,那么这个变量应该被定义成静态变量
    • 所有和静态变量相关的增删改查都应该使用类名来处理
    • 而不应该使用对象名直接修改静态变量
posted @ 2020-08-05 17:02  韩子清  阅读(100)  评论(0)    收藏  举报