python基础班第12课
复习
class MyClass(): # 定义类 图纸
color ='red' # 属性
def yanse(self):# 方法 行为
print('车子是红色的')
mc =MyClass() #对象 类的实例化
print(mc.color)
mc.yanse()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
'''
面向过程
1.打开门
2.装大象
3.关门
'''
'''
面向对象(.后面是方法def)
1.冰箱.开门
2.冰箱.存储
3.冰箱.关门
'''
class Person():
name ='liuyifei'
def speak(self):
print('大家新年好')
p1 =Person()
print(p1.name)
p1.speak()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
class Person():
name ='liuyifei'
def speak(self):
print('大家新年好')
p1 =Person()
p1.name ='zhouhuimin'
print(p1.name)
p1.speak()码片
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
class Person():
name ='liuyifei'
def speak(self):
print('大家新年好')
p2 =Person()
print(p1.name)
p1.speak()
print(p2.name)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
结论
属性最好是携带在实例(对象)中比较好,也就是创建实例属性
行为(方法)最好创建在类中
1.特殊方法
# 特殊方法
class Person():
def __init__(self):对于init方法,创建实例的时候就会被调用(自动)
print(11111)
# def speak(self): # 谁调用speak方法,w就是那个对象本身
# print('大家新年好,我是%s'% self.name)
p1 =Person()
p1.__init__() #(手动调用)
# p1.name ='liuyifei'
# p1.speak()
p2 =Person()
# p2.name ='zhouhuimin'
# p2.speak()
p3 =Person()
# p3.name ='guanzhilin'
# p3.speak()
即是当用到self.name必须定义每一个对象的name(属性)会很麻烦
name这个属性是必须的,但每一个对象的name(属性)各不相同,不能直接在类中定义,
手动添加name属性容易遗忘,即使没有遗忘,查看源码很麻烦
解决方法 __init__
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
class Person():
# name =‘刘亦菲’ #跟下面结果一样但是概念不同
def __init__(self,name):
self.name =name # 下面要传参
# self.name ='huluwa'# 属性被定义在方法里
def speak(self): # 谁调用speak方法,w就是那个对象本身
print('大家新年好,我是%s'% self.name)
p1 =Person('liuyifei')# 在这里传参
# p1.__init__()
# p1.name ='liuyifei'
p1.speak()
p2 =Person('zhouhuimin')
# p2.name ='zhouhuimin'
p2.speak()
如果创建实例的时候没有定义name会直接报错
p3 =Person()
# p3.name ='guanzhilin'
p3.speak()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
2.参数self
方式一:传参方式
class Person():
def speak(w,name):# 传参方式
print('大家新年好,我是%s'% name)
p1 =Person()
p2 =Person()
p1.name ='zhouhuimin'
p2.name ='liuyifei'
print(p1.name)
p1.speak('zhouhuimin')
p2.speak('liuyifei')
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
class Person():
def speak(w):
# print('大家新年好,我是%s'% p1.name)
print(w)
p1 =Person()
print(p1)
p2 =Person()
print(p2)
p1.name ='zhouhuimin'
p2.name ='liuyifei'
p1.speak()
p2.speak()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
结论
谁调用方法,w(self)就是对象本身
方法二 self.
class Person():
def speak(w): # 谁调用speak方法,w就是那个对象本身 方法二
print('大家新年好,我是%s'% w.name)
p1 =Person()
# print(p1)
p2 =Person()
# print(p2)
p1.name ='zhouhuimin'
p2.name ='liuyifei'
p1.speak()
p2.speak()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
3.封装
# 封装
class Car():
def __init__(self,name,color):
self.name =name
self.color =color
def run(self):
print('开始跑了')
def dididi(self):
print('嘀嘀嘀')
car =Car('玛莎','黑色')
print(car.name,car.color)
car.run()
car.dididi()
car.name ='中华田园犬'
print(car.name,car.color)
car.run()
car.dididi()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
class Dog():
def __init__(self,name):
self.name =name
dog =Dog('藏獒')
# dog.name ='泰迪'
print(dog.name)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
class Dog():
def __init__(self,name):
self.name =name
dog =Dog('藏獒')
dog.name ='泰迪'# 改变了属性 但是一般不用这个方法
print(dog.name)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
# 封装是一个暗号,告诉你的协同开发者数据很重要,不要轻易修改
class Dog():
def __init__(self,name):
self.hidden_name =name #一般用的是_name 就是单下划线+属性
dog =Dog('藏獒')
dog.name ='泰迪' # 这里是重新给dog这个对象赋予一个属性值name
print(dog.hidden_name)
print(dog.name)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
# 封装是一个暗号,告诉你的协同开发者数据很重要,不要轻易修改
class Dog():
def __init__(self,name):
self.hidden_name =name # 这就是暗号 但通常是_属性
# 创建一个方法 getter()方法 给调用者一个查询数据的方法
def get_name(self): get_name 是一个特殊方法 下面的set_name也是
print('get方法被调用')
return self.hidden_name # 要查看return就像函数一样要在调用的时候加print
# 创建一个setter()方法,给调用者一个修改数据的方法
def set_name(self,name):
print('set方法被调用')
self.hidden_name =name
dog =Dog('藏獒')
dog.name ='泰迪' # 这里是重新给dog这个对象赋予一个属性值name
# print(dog.hidden_name)
# print(dog.name)
# 调用get和set
dog.get_name()
print(dog.get_name()) # get加return的返回值
dog.set_name('泰迪')
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
暗号:__name(下划线加xx)
# 真正的暗号
class Dog():
def __init__(self,name):
self._name =name
- 1
- 2
- 3
- 4
class Dog():
def __init__(self,name):
self.__name =name 双下划线 不可改了
# 创建一个方法 getter()方法 给调用者一个查询数据的方法
def get_name(self):
print('get方法被调用')
return self.__name # 双下划线
# 创建一个setter()方法,给调用者一个修改数据的方法
def set_name(self,name):
print('set方法被调用')
self.__name =name # 双下划线
# 单下划线是可以修改但是要商量 隐藏属性
# 双下划线是不可以修改的 私有属性
dog =Dog ('藏獒')
# dog.name ='泰迪' # 这里是重新给dog这个对象赋予一个属性值name
# # print(dog.get_name())
# # print(dog.set_name('泰迪'))
dog._Dog__name ='泰迪' # 双下划线的还是可以这样改的 这里要双下划线
print(dog.get_name())
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
class Dog():
def __init__(self,name):
self.__name =name
# 创建一个方法 getter()方法 给调用者一个查询数据的方法
def get_name(self): # 是一个特殊方法 # 下面的set_name也是
print('get方法被调用')
return self.__name # 要查看return就像函数一样要在调用的时候加print
# 创建一个setter()方法,给调用者一个修改数据的方法
def set_name(self, name):
print('set方法被调用')
self._name =name
return self._name
dog =Dog ('藏獒')
# dog.name ='泰迪' # 这里是重新给dog这个对象赋予一个属性值name
# # print(dog.get_name())
print(dog.set_name('泰迪'))
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16