python第十三课 面向对象(二)

mac2024-04-21  42

一、特殊方法(魔术方法)

在Python中,所有以“__”双下划线包起来的方法,都统称为“Magic Method”,中文称『魔术方法』,例如类的初始化方法 init 。 特殊方法都是以__开头__结尾的方法 无需人为调用,基本是在特定的时刻自动触发

类的基本结构

class 类名([父类]): # 公共属性... # 对象的初始化方法 def __init__(self,....): # .... # 其他的方法 def method(self,...) # .... class Person: def __init__(self, name, age): self.name = name self.age = age def speak(self): print('大家好,我是%s。'%self.name, '我今年%s岁'%self.age) p1 = Person('张三', 24) p1.speak() >>> 大家好,我是张三。 我今年24岁 # 修改p1实例中的参数 p1.name = '李四' p1.age = 21 p1.speak() >>> 大家好,我是李四。 我今年21岁

二 类的练习

#尝试定义一个表示车的类 ‘’’ 属性: name color 方法: run() laba() ‘’’

class car: def __init__(self, name, color): self.name = name self.color = color def run(self): print('%s直线行驶'%self.name) def sound(self): print('dididi') c1 = car('BMW', '黑色') c2 = car('奔驰', '银色') c1.run() c1.sound() c2.run() c2.sound() >>> BMW直线行驶 >>> dididi >>> 奔驰直线行驶 >>> dididi

三、封装

#封装是面向对象的三大特性之一 封装指的是隐藏对象中一些不希望被外部访问到的属性或方法

为什么要封装?

1.我们要增加数据的安全性 2.属性不能随意修改(我让你改你才能改,不让你改你就别改) 3.属性不能改为任意的值

如何隐藏对象中的值? 我们可以提供一个get和set方法可以访问和修改属性

class Dog: #初始化函数 def __init__(self,name,age): self.hidden_name = name self.hidden_age = age #需要执行的代码块 def speak(self): # print('大家好,我是一只{}岁的{}'.format(self.hidden_age, self.hidden_name)) print(f'大家好,我是一只{self.hidden_age}岁的{self.hidden_name}') #获取名字设置名字 def get_name(self): #return self.hidden_name print(f'种类:{self.hidden_name}') def set_name(self,name): self.hidden_name = name print('更改种类为:', name) #获取年龄和设置年龄(年龄不能为负数) def get_age(self): #return self.hidden_age print(f'年龄:{self.hidden_age}岁') def set_age(self,age): if age > 0: self.hidden_age = age print('更改年龄为:%s岁'%age) dog1 = Dog('藏獒', 3) print('更改信息前:',end='') dog1.speak() dog1.get_name() dog1.set_name('哈士奇') dog1.get_age() dog1.set_age(5) print('更改信息后:',end='') dog1.speak() >>> 更改信息前:大家好,我是一只3岁的藏獒 >>> 种类:藏獒 >>> 更改种类为: 哈士奇 >>> 年龄:3岁 >>> 更改年龄为:5岁 >>> 更改信息后:大家好,我是一只5岁的哈士奇

#使用封装,确实增长了类定义复杂度,但是它确保了数据的安全性 1.隐藏了属性名,使调用者无法随意修改对象当中的属性 2.增加了get和set方法,可以很好的控制属性是否是只读的 如果希望属性是只读的,则可以直接去掉set方法 如果希望属性不能被外界访问,则可以 直接渠道get方法 3.使用set方法设置属性,可以增加数据的验证,确保数据的值是正确的 4.可以在读取属性和设置属性做一些其他的操作

四、封装(二)

可以为对象的属性使用双下划线开头,__xxx 双下划线开头的属性是对象的隐藏属性,隐藏属性只能在类的内部访问,无法通过外部访问 隐藏属性是python自动为属性改了一个名字 实际改的名字是: _类名_属性名 __name -> _Person__name

class Person: def __init__(self,name): self._name = name def get_name(self): return self._name def set_name(self,name): self._name = name p = Person('葫芦娃') print(p.get_name()) p.set_name('钢铁侠') print(p.get_name()) >>> 葫芦娃 >>> 钢铁侠

一般情况,使用_开头的属性都是私有属性,没有特殊情况下不要修改私有属性

五 、 @property装饰器

用来将一个get方法 转换为对象的属性 添加property装饰器以后,我们就可以像调用属性一个调用方法

class Person: def __init__(self,name): self._name = name @property def name(self): print('get方法执行了') return self._name #转化为属性之后调用的过程中可以直接作为对象调用 @name.setter def name(self,name): self._name = name p1 = Person('钢铁侠') p1.name p1.name = '葫芦娃' print('p1.name') >>> get方法执行了 >>> p1.name
最新回复(0)