一、面向对象的精髓
将数据和处理数据的代码绑定,成了一个对象。 只要获取到对象,相应的数据和方法就有了。
二、组合
class Person:
def __init__(self,name,sex):
self.name = name
self.sex = sex
class Student(Person):
def __init__(self,name,sex,number):
super().__init__(name,sex)
self.number = number
class Phone:
def __init__(self,phonenumber):
self.phonenumber = phonenumber
def phonecall(self):
print("%s 打电话" %self.phonenumber)
创建两个对象:
s = Student("kevin","male","007")
p = Phone("18855555555")
为对象s添加phone属性,属性指向另一个对象
s.phone = p
对象s通过phone属性可以调用对象p的方法(函数)
s.phone.phonecall()
print(s.__dict__)
输出结果:
18855555555 打电话
{'name': 'kevin', 'sex': 'male', 'number': '007', 'phone': <__main__.Phone object at 0x00000160C8A6BD30>}
三、封装
什么是封装: 在程序中,封装指的是将内容隐藏起来(在面向对象的编程中,隐藏的是属性和方法)。 注意:封装绝不是单纯的隐藏,封装是隐藏内部实现的细节,对外提供使用接口。
为什么要封装: 封装是为了明确区分内部和外部。 可以提高安全性(比如cpu频率,缓冲出大小)对于封装属性而言,是通过给访问和修改增加额外的逻辑判断实现的。
如何使用封装: 在属性或方法名称前加上两个下划线,就可以将其设置为私有属性/方法。 python中权限只有两种,公开和私有。 属性的封装,通常需要提供相应的设置器和访问器。
封装的特点: 被隐藏的内容,在内部是可以访问的,在外部是不可以访问的。
class Person:
def __init__(self,name,sex,idcard):
self.name = name
self.sex = sex
self.__idcard = idcard
def say_hi(self):
print("hello,I am %s" %self.name)
def idcard(self):
print("my idcard is %s" %self.__idcard)
def get_idcard(self,pwd): # 可以使用方法,将内部封装的内容返回出去
if pwd == 123:
return self.__idcard
else:
return "滚"
def set_idcard(self,pwd,new): # 可以使用方法,将内部封装的属性进行修改
if pwd == 123:
self.__idcard = new
return self.__idcard
else:
return "滚"
p = Person("egon","male","3456789987654")
p.say_hi()
p.idcard() # 通过函数可以访问(函数中如果有)
# p.__idcard # 是无法访问的
print(p.get_idcard(123)) # 既实现了隐藏,又提供了访问的接口(还可以验证)
print(p.set_idcard(123,"xxxxxxxxxxx")) # 修改方法