python面向对象——类(中)
1. 特殊方法
- 在类中可以定义一些特殊方法也称为魔术方法
- 特殊方法都是形如 xxx()这种形式
- 特殊方法不需要我们调用,特殊方法会在特定时候自动调用
class MyClass(): #定义一个类
# name = '刘亦菲'
def speak(self): #定义方法
print('大家好,我是%s'%self.name)
p1 = MyClass() #类的实例化
p1.name = '刘亦菲'
p1.speak() #在没有定义类的公共属性的情况下会报错,
# 两种的定义公共属性的方法:
# 1.通过 对象.属性 如:p1.name = '刘亦菲'
# 2.在类里面定义 如:类里面的 name = '刘亦菲'
#'使用初始化方法解决的问题:'
#问题: 1.手动添加容易忘记,查看代码需要那些参数比较麻烦
# 2.没有提示,可以创建成功实例,会导致后面的代码运行出错
class Preson(): #定义一个类
#初始化方法
def __init__(self,name,age): #实例化创建的时候,init方法就会报错
self.name = name
self.age = age
def speak(self):
print('大家好,我是{},永远{}'.format(self.name,self.age))
name = input('请输入姓名:')
age = input('请输入年龄:')
p1 = Preson(name,age) #类的实例化
p1.speak()
- 出现封装的原因:是为了数据的安全,形成了一个默认的规则。告诉你的协同开发者这个属性很重要,不要随意修改
。1. 属性不能随意修改
。2. 属性不能改为任意的值
class Car(): #定义一个类
#初始化方法
def __init__(self,name,color):
self.hidden_name = name
self.color = color
def run(self):
print('汽车开始跑起来了')
def dida(self):
print('汽车鸣笛')
car = Car('法拉利','红色') #类的实例化
car.name = '中华田园犬'
car.run() #调用方法
car.dida()
- 封装是面向对象的三大特性之一
- 封装是指隐藏对象中一些不希望被外部所访问到的属性或方法
# 封装:私有属性
class Car():
def __init__(self,name,color):
self._name = name #私有属性,一般使用这个私有属性,属于商议协定
self.color = color
def run(self):
print('汽车开始跑起来了')
def dida(self):
print('汽车鸣笛')
car = Car('法拉利','红色')
car._name = '中华田园犬'
car.run()
car.dida()
- 我们也可以提供给一个getter()和setter()方法是外部可以访问到属性
• getter() 获取对象中指定的属性
• setter() 用来设置对象指定的属性
class Car():
def __init__(self,name,color):
self._name = name #私有属性,一般使用这个私有属性,属于商议协定
self.color = color
#getter方法:提供访问这个属性的方法
def get_name(self):
return self._name
#setter方法:提供修改属性的方法
def set_name(self,name):
self._name = name
def run(self):
print('汽车开始跑起来了')
def dida(self):
print('汽车鸣笛')
car = Car('法拉利','红色')
# car._name = '中华田园犬'
car.run()
car.dida()
# print(car._Car__name)
print(car.get_name())
car.set_name('玛莎拉蒂')
print(car.get_name())
-
使用封装,确实增加了类的定义的复杂程度,但是它也确保了数据的安全
• 1. 隐藏属性名,使调用者无法随意的修改对象中的属性
• 2. 增加了getter()和setter()方法,很好控制属性是否是只读的
• 3. 使用setter()设置属性,可以在做一个数据的验证
• 4. 使用getter()方法获取属性,使用setter()方法设置属性可以在读取属性和修改属性的同时做一些其他的处理 -
可以为对象的属性使用双下划线开头 __xxx。双下划线开头的属性,是对象的隐藏属性,隐藏属性只能在类的内部访问,无法通过对象访问
-
其实隐藏属性只不过是Python自动为属性改了一个名字 --> _类名__属性名 例如 __name -> _Person__name
#封装:隐藏属性
class Car():
def __init__(self,name,color):
self.__name = name #隐藏属性,不可读的属性
self.color = color
def run(self):
print('汽车开始跑起来了')
def dida(self):
print('汽车鸣笛')
car = Car('法拉利','红色')
car.__name = '中华田园犬'
car.run()
car.dida()
print(car._Car__name)
• 这种方式实际上依然可以在外部访问,所以这种方式我们一般不用。一般我们会将一些私有属性以_开头
• 一般情况下,使用_开头的属性都是私有属性,没有特殊情况下不要修改私有属性
- 我们可以使用@property装饰器来创建只读属性,@property装饰器会将方法转换为相同名称的只读属性,可以与所定义的属性配合使用,这样可以防止属性被修改
# 封装:私有属性
class Car():
def __init__(self,name,color):
self._name = name #私有属性,一般使用这个私有属性,属于商议协定
self.color = color
#getter方法:提供访问这个属性的方法
@property
# def get_name(self):
# return self._name
def name(self):
return self._name
#setter方法:提供修改属性的方法
@name.setter
# def set_name(self,name):
# self._name = name
def name(self,name):
self._name = name
def run(self):
print('汽车开始跑起来了')
def dida(self):
print('汽车鸣笛')
car = Car('法拉利','红色')
# car._name = '中华田园犬' #访问属性
car.run() #调用方法
car.dida()
# print(car._Car__name)
print(car.name)
car.name = '玛莎拉蒂'
print(car._name)
本文为学习笔记,转载请标明出处,本文仅供交流学习,请勿用于非法途径,希望本文对大家有帮助。
仅是个人意见,如有不足之处或者侵权,请留言

浙公网安备 33010602011771号