Python 基础之面向对象初识与类的封装
一.面向对象类的初识
1.类的定义
#三种方式:
#1.
class MyClass:
pass
#2.推荐
class MyClass():
pass
#3.
class MyClass(object):
pass
总结为一句话:class 类名可以不加括号,可以加括号,可以加括号而且括号里面加object。
2.类的实例化
class MyClass():
pass
#类的实例化,实例化对象
obj = MyClass() #obj 就是一个对象
3.类的基本结构
只有成员方法和成员属性
对象.属性 对象.方法()
#例:
class MyClass():
#成员属性
color = "绿色"
#成员方法
def pa(self):
print("我小时候很喜欢爬树")
obj = MyClass()
print(obj.color)
obj.pa()
'''
语法允许,大师一定不要这么写,class 和 def 不太一样
函数在调用时,才会触发里面的代码块
而类只要执行到这一行,就会触发了
class MyClass():
if 5 == 5:
print(5555)
'''
#改造
class MyClass():
def func(self):
if 5 == 5:
print(555)
obj = MyClass()
obj.func()
#类的命名:
在对类进行命名的时候,推荐使用大驼峰命名法
对于类的命名参考变量变量命名方式
二.类的封装性
公有的,在类可以调用类的相关公有属性
私有的(前面开头加上__ 两个下划线),在外类不可以调用类内的相关私有属性方法
绑定方法:
(1)绑定对象 (默认系统把对象当成参数传递)
(2)绑定到类 (默认系统把类当成参数传递)
这两个参数,无论哪种,都是系统自己传递的
但是参数需要我们自己定义好
#例:
class Car():
#公有属性
logo = "特拉斯"
color = "绿色"
#私有属性
__oil = '2.5L'
#公有方法
def run(self):
print("我的小车跑的快")
def jiao(self):
print("我的%s 小车会滴滴的叫" % (self.logo))
def jiao2(self):
print("我的%s 小车会滴滴的叫,颜色 %s" % (self.logo,self.color))
#私有方法
def __oil_info(self):
print("这就是我的私有方法")
#实例化对象
obj = Car()
print(obj)
#对象的相关操作
1.实例化的对象访问公有成员属性和方法
对象.属性
对象.方法()
#(1)调用公有成员属性
print(obj.logo)
#print(obj.__oil) #私有的无法在类外调用
#(2)调用公有成员方法
系统自己会默认的把obj这个对象当成参数进行传递
传递给run这个方法,用self这个参数进行接收
obj.run()
obj.jiao()
#obj.__oil_info() #error 私有的不能够在进行调用
2.实例化的对象动态添加公有成员属性
obj.jiao2() #输出是绿色
obj.color = "黄色"
print(obj.color)
obj.jiao2() #现在输出是黄色
#查看obj 这个对象的内部成员,使用__dic__
print(obj.__dict__) #只有自定义的
类中的成员属性和方法可以给对象使用
但是只有使用权,没有归属权
类里面的成员属性和方法只对数类所有
对象只能使用(获取) 不能修改或删除
不归对象所有
3.实例化的对象动态添加公有成员方法
##(1) 添加无参方法
def func():
print("我的汽车会变成,请叫我大黄蜂")
#把func方法复制给成员方法bianxing
obj.bianxing = func
obj.bianxing()
print(obj.__dict__)
##(2)添加有参方法
def qingtianzhu(name):
print("请叫我"+name)
obj.qingtianzhu = qingtianzhu
obj.qingtianzhu("擎天柱")
print(obj.__dict__)
#改造一
obj.color = "蓝色"
def qingtianzhu(self,name):
print("请叫我"+name,"我的颜色是"+self.color)
obj.qingtianzhu = qingtianzhu
obj.qingtianzhu(obj,"擎天柱")
#改造2 把qintianzhu变成绑定 方法(系统帮助我们传递对象)
import types
#MehtodType (函数,对象) 要把那个函数作为对象的绑定方法
obj.qingtianzhu = types.MethodType(qingtianzhu,obj)
obj.qingtianzhu("擎天柱")
##(3)lambda 表达式
obj.fangxiangpan = lambda : print("我是方向盘的制作方法")
obj.fangxiangpan()
三.类的相关操作
#例:
class MyCar():
oil = "涡轮增压发动机1.5T"
__price = "100万"
#公有普通方法(只能类来调用)
def oil_info():
#类.oil
print("我的油耗信息:"+MyCar.oil)
#私有普通方法
def __price_info():
print("我的价格是保密")
#obj = MyCar()
#obj.oil_info() 对象调用不了
1.定义的类访问公有成员属性和方法
类.成员属性
类.成员方法()
无论是私有属性还是方法都无法在类外调用
print(MyCar.oil)
MyCar.oil_info()
#MyCar.__price_info() error 无法使用类来调用私有成员
2.定义的类动态添加公有成员属性和方法
#公有属性
MyCar.logo = "中国一汽"
print(MyCar.logo)
#使用__dict__查看类内的成员
print(MyCar.__dict__)
#公有方法
##(1)无参方法
def dahuangfeng():
print("请叫我大黄蜂")
MyCar.dahuangfeng = dahuangfeng
MyCar.dahuangfeng()
##(2)有参方法
def qingtianzhu(name):
print("请叫我"+name)
MyCar.qingtianzhu = qingtianzhu
MyCar.qingtianzhu("一柱擎天")
##(3)lambda 表达式
MyCar.dog = lambda : print("我的车还会变成机器狗")
MyCar.dog()
3.如何访问私有成员
#例:
class Plane():
#公有属性
captain = "peter"
#私有属性
__air_sister = "20个"
#公有绑定方法
def fly1(self):
print("飞机会飞1")
#公有普通方法
def fly2():
print("飞机会飞2")
#私有的绑定方法
def __oil_info1(self):
print("飞机百公里油耗是10升1")
#私有的普通方法
def __oil_info2():
print("飞机百公里油耗是10升2")
#公有的绑定方法
def pub_info1(self):
print(self.__air_sister)
self.__oil_info1()
print(self.captain)
#公有的普通方法
def pub_info2():
print(Plane.__air_sister)
Plane.__oil_info2()
##(1)如何访问类的私有成员?
利用公有方法调用类内的私有成员
私有成员在本类之内可以随便调用,在本类之外不能调用
#实例化对象 方法一
obj = Plane()
obj.pub_info1()
#也可以使用类来调用 方法二
Plane.pub_info2()
##(2)如果就想直接在类外调用私有成员,有方法吗
私有成员的改名策略:
_类名+私有成员 (没有真正的私有化,类外可以通过改名策略仍然调取)
print("========")
print(obj._Plane__air_sister)
Plane._Plane__oil_info2()
##(3)如何删除成员
# (1) 实例化的对象删除公有成员属性和方法
obj = Plane()
print(obj.__dict__)
print(obj.captain)
captain 成员属性归属于class Plane的,不是obj 的
obj 可以有使用权,没有所有权(不能够修改或者删除类内的属性)
如果对象有该属性方法,先优先调用该对象里面的成员
如果都没有.直接报错
#删除对象属性
obj.captain = "JIAN"
print(obj.__dict__)
print(obj.captain)
del obj.captain
print(obj.captain) #obj自己的captain 被删除了
#obj.pub_info1() 里面的peter还在
#删除对象的方法
print("==========")
obj.fly222 = lambda : print("我的飞机能潜水")
obj.fly222()
print(obj.__dict__)
# del obj.fly
# print(obj.__dict__)
##(2)定义的类删除公有成员属性和方法
对象可以调用类中的公有成员和方法
类不能调用对象的相关成员属性和方法
方向不可逆
一个类可以产生多个对象,多个对象彼此之间,相互独立
#删除类的成员属性
# del Plane.captain
# print(Plane.captain)
# print(obj.captain)
# Plane.fly111222() error 类不能调用对象的方法
# 删除类的成员方法
del Plane.pub_info1
# Plane.pub_info1() error 不存在