1. 特殊⽅法
- 在类中有⼀些特殊⽅法也称为魔术⽅法
- 特殊⽅法都是形如 _ _ xxx _ _()这种形式
- 特殊⽅法无需调⽤,特殊⽅法会在特定时候⾃动调⽤
class hero:
#print('hero中的代码')
def __init__(self,name):
print('hello')
p1=hero()
#hello这是由程序本身调用的特殊方法。
- 类中的代码先执行,再执行方法中的代码
class hero:
print('hero中的代码')
def __init__(self,name):
print('hello')
##hero中的代码 hello
#在创建对象的时候,必须设置name属性。如果不设置对象都无法创建
class hero:
#name = 'ironman'#公共属性
def __init__(self,name):
#通过self向新创建的对象初始化属性
#其实这里的self.name就相当于p1.name或者p2.name.等同于单独定义的独有属性例如p1.name='batman'.第二个name就是类似于平时定义的函数的参数是不变的,第一个name是必须的
self.name=name
def oneself(self):
print('everyone, I am %s'%self.name)
p1=hero('batman')
p1.oneself()
#everone ,I am batman
p2=hero('superman')
p2.oneself()
#everone ,I am superman
类的基本结构
class 类名(父类):
公共属性
# 对象初始化的方法
def __init__(self,......):
....
# 其他的方法
def method1(self,....)
.....
def method2(self,....)
.....
2. 封装
-
出现封装的原因:为了数据的安全性,通常由于通过对象.属性的方式来修改属性值导致了对象中的属性会被随意修改而不安全。
- 属性不能随意修改
- 属性不能改为任意的值
-
封装是⾯向对象的三⼤特性之⼀
-
封装是指隐藏对象中⼀些不希望被外部所访问到的属性或⽅法
2.1封装操作的方式
-
如何隐藏属性
将对象的属性名,修改为外部环境无法知道的名字 -
如何获取(修改)对象中的属性
可以提供给⼀个getter()和setter()方法使得外部可以访问到属性- getter() 获取对象中指定的属性
- setter() ⽤来设置对象指定的属性
-
使⽤封装,确实增加了类的定义的复杂程度,但是它也确保了数据的安全
- 隐藏属性名,使调用者无法随意的修改对象中的属性
- 增加了getter()和setter()⽅法,很好控制属性是否是只读的。 如果希望属性只读,则可以直接去掉setter方法。 如果希望属性不能被外部访问,则可以直接去掉getter方法
- 使⽤setter()设置属性,可以添加数据的验证,确保数据的值是正确的
- 使⽤getter()方法获取属性,使⽤setter()方法设置属性可以在读取属性和修改属性的同时做⼀些其他的处理
class Animal:
def __init__(self,name,age):
self.hidden_name=name#这类方式依然可以被外界更改。通常用_开头命名的属性都是私有属性也是较强的封装
self.hidden_age=age
def cloud(self):
print('I am %s'%self.hidden_name)
def get_name(self):
#get_name()获取对象的name属性
return self.hidden_name
def set_name(self,name):
#set_name()修改对象的name属性
self.hidden_name=name
def get_age(self,age)
return self.hidden_age=age
def set_age(self,age)
if age>0
self.hidden_age=age#使用setter方法增加数据的验证
d=Animal('dog')
2.2隐藏属性私有方法
- 可以对对象的属性使用双__下划线开头
- 双下划线的属性是对象的隐藏属性,隐藏属性只能在类的内部访问,无法通过对象访问
- 其实隐藏属性只不过是Python自动为属性修改了一个名字 实际上将改的名字改为了 _ 类名 _ _属性名 例如 _ _name 相当于 _ 类名 _ _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('spiderman')
p.set_name('superman')
print(p.get_name())
3.property装饰器
- 我们可以使⽤@property装饰器来创建只读属性,@property装饰器会将⽅ 法转换为相同名称的只读属性,可以与所定义的属性配合使⽤,这样可以防⽌属性被修改
class Person:
def __init__(self,name):
self._name = name
# @property 将方法转换为相同名称的只读属性
@property
def name(self):
return self._name
# 这个是setter方法 setter方法的装饰器 @属性名.setter
@name.setter
def name(self,name):
self._name = name
p=Person('spiderman')
p.name='superman'
print(p.name())#不加装饰器时,直接输出superman,这是方法调用
print(p.name)#加了装饰器时,该方法直接转化为属性。输出superman