面向对象(二)

面向对象(二)

  • 添加对象属性
class Person:
    address='河北'
    def __init__(self,name):#初始化方法
        #self代表实例化对象
        self.keyname=name
    def func(self,sex):#实例化方法,普通方法
        self.sex=sex
obj=Person('张三')
#类的外部添加属性
obj.age=20
print(obj.age)#20
# 类的内部添加属性
print(obj.__dict__)#{'keyname': 'Lisa', 'age': 20}
obj.func('男')
print(obj.sex)#男
print(obj.__dict__)#{'keyname': 'Lisa', 'age': 20, 'sex': '男'}
#类和实例化对象是两个独立的命名空间,age是实例化对象中增加的属性,保存在实例化对象的命名空间里,通过Person.无法获取
print(Person.age)#error
  • 添加类的静态属性
class Person:
    def __init__(self,name):
        self.name = name
    def methods(self,sex):
        self.sex = sex
    def methods1(self, val):
        Person.Static = val
#类的外部可以添加
Person.school = 'CIDP'
print(Person.__dict__)#{'__module__': '__main__', '__init__': <function Person.__init__ at 0x014946A0>, 'methods': <function Person.methods at 0x01494658>, 'methods1': <function Person.methods1 at 0x01494610>, '__dict__': <attribute '__dict__' of 'Person' objects>, '__weakref__': <attribute '__weakref__' of 'Person' objects>, '__doc__': None, 'school': 'CIDP'}
#类的内部也可以添加。
obj = Person('悠然')
Person.methods1(obj,'添加的值')
print(Person.__dict__)#{'__module__': '__main__', '__init__': <function Person.__init__ at 0x014946A0>, 'methods': <function Person.methods at 0x01494658>, 'methods1': <function Person.methods1 at 0x01494610>, '__dict__': <attribute '__dict__' of 'Person' objects>, '__weakref__': <attribute '__weakref__' of 'Person' objects>, '__doc__': None, 'school': 'CIDP', 'Static': '添加的值'}
print(obj.__dict__)#{'name': '悠然'}
  • 类命名空间与对象、实例的命名空间

    1. 增:类.属性=值:在类命名空间增加了一个属性名和属性值
      对象.属性=值:在对象命名空间增加了一个属性名和属性值
    2. 删:无论是类删除属性还是对象删除属性,都是删除自己的命名空间的属性
    3. 改: 类.属性=值 如果类命名空间中有相同的属性就是改,否则是增加
      对象.属性=值 如果对象命名空间中有相同的属性就是改,否则是增加,不会去类中找
    4. 查:类.属性去查,只找本类命名空间,不会找对象命名空间
      对象.属性去查,先找自己的命名空间是否有这个属性,如果有这个属性就用自己的,如果没有这个属性就去类命名空间去找,找到就用类命名空间的属性,没有就报错
    • 注意:

      1. 对象查找属性的顺序:先从对象空间找 --> 类空间找 --> 父类空间找

      2. 类名查找属性的顺序:先从本类空间找 --> 父类空间找

        (上面的顺序都是单向不可逆,类名不可能找到对象的属性)

  • 类与类之间的关系:依赖关系、关联关系、组合关系、聚合关系、实现关系、继承关系。

    • 依赖关系:将一个类的对象传到另一个类的方法中使用
    class Person:
        def __init__(self, name):
            self.name = name
        def open(self,obj1):
            ''' 开⻔ '''
            print('人要开门了')
            obj1.open_door()
        def close(self):
            ''' 关⻔ '''
            print('人要关门了')
    class Car:
        def open_door(self):
            print("车⻔被打开了")
        def close_door(self):
            print("车⻔被关上了")
    Person1 = Person('小志')
    Carobj = Car()
    Person1.open(Carobj)
    
    • 关联关系:一个类的实例对象的属性值是另一个类的实例对象
    class Boy:
        def __init__(self,name):
            self.name = name
        def associated(self,girlFriend=None):
            if girlFriend:
                print('%s 和 %s 一对情侣共进晚餐'%(self.name,girlFriend))
            else:
                print('单身,吃什么饭')
    class Girl:
        def __init__(self,name):
            self.name = name
    boy = Boy('赵四')
    girl=Girl("丹丹")
    boy.associated() #  输出:单身,吃什么饭
    # 丹丹成了赵四的女朋友
    boy.girlFriend = girl  
    boy.associtated(boy.girlFriend.name)#赵四 和 丹丹 一对情侣共进晚餐
    #或:boy.associated(girl.name)
    
    • 组合关系:在一个类中以另外一个类的对象作为数据属性,称为类的组合
    class BirthDate:
        def __init__(self,year,month,day):
            self.year=year
            self.month=month
            self.day=day
    class Couse:
        def __init__(self,name):
            self.name=name
    class Teacher:
        def __init__(self,name,sex,birth,course):
            self.keyname=name
            self.keygender=sex
            self.keybirth=birth
            self.keycourse=course
        def introduce(self):
            print('%s是%s同志,%s出生,教授的课程是:%s'%(self.keyname,self.keygender,self.keybirth.__dict__,self.keycourse.name))
    BirthObj=BirthDate('1990','1','1')
    print(BirthObj)
    CouseObj=Couse('python')
    WuSir=Teacher('WuSir','男',BirthObj,CouseObj)
    WuSir.introduce()#WuSir是男同志,{'year': '1990', 'month': '1', 'day': '1'}出生,教授的课程是:python
    
posted @ 2021-04-10 19:17  辰-月  阅读(37)  评论(0编辑  收藏  举报