面向对象(二)
面向对象(二)
- 添加对象属性
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__': , 'methods': , 'methods1': , '__dict__': , '__weakref__': , '__doc__': None, 'school': 'CIDP'}
#类的内部也可以添加。
obj = Person('悠然')
Person.methods1(obj,'添加的值')
print(Person.__dict__)#{'__module__': '__main__', '__init__': , 'methods': , 'methods1': , '__dict__': , '__weakref__': , '__doc__': None, 'school': 'CIDP', 'Static': '添加的值'}
print(obj.__dict__)#{'name': '悠然'}
-
类命名空间与对象、实例的命名空间
- 增:类.属性=值:在类命名空间增加了一个属性名和属性值
对象.属性=值:在对象命名空间增加了一个属性名和属性值 - 删:无论是类删除属性还是对象删除属性,都是删除自己的命名空间的属性
- 改: 类.属性=值 如果类命名空间中有相同的属性就是改,否则是增加
对象.属性=值 如果对象命名空间中有相同的属性就是改,否则是增加,不会去类中找 - 查:类.属性去查,只找本类命名空间,不会找对象命名空间
对象.属性去查,先找自己的命名空间是否有这个属性,如果有这个属性就用自己的,如果没有这个属性就去类命名空间去找,找到就用类命名空间的属性,没有就报错
-
注意:
-
对象查找属性的顺序:先从对象空间找 --> 类空间找 --> 父类空间找
-
类名查找属性的顺序:先从本类空间找 --> 父类空间找
(上面的顺序都是单向不可逆,类名不可能找到对象的属性)
-
- 增:类.属性=值:在类命名空间增加了一个属性名和属性值
-
类与类之间的关系:依赖关系、关联关系、组合关系、聚合关系、实现关系、继承关系。
- 依赖关系:将一个类的对象传到另一个类的方法中使用
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