面向对象开发

1. 基本知识:

# (1) 类的定义: 使用class关键字定义,类名最好采用大驼峰体
class MyCar1:   #可以不加括号
    pass

class MyCar2():   # 此种方法推荐
    pass
class MyCar3(object): 
    pass

# (2) 类的实例化:    
obj = MyCar2()

# (3) 类的基本结构: 类中值包含两种成员,一种是成员属性(相当于变量),一种是成员方法(相当于函数)
class MyHouse():
    size = "big"
    def func1(self):
        print("It's a dream")

 2. 定义一个类:  类里面包含公有属性和方法,私有属性和方法

class Travel():
    didian = "海南"   # 公有属性
    __jiudian = "海韵"  # 私有属性
    def luxian(self):      # 公有方法,形参self,也叫绑定方法(绑定到对象)
        print("先去南海观音,再去天涯海角")
    def __shijian(self):  # 私有方法
        print("明天启程")

3. 对象的相关操作:

3.1 实例化对象访问公有成员的属性和方法,若是调用私有的属性或方法,程序会报错

obj = Travel()
print(obj.didian) # 海南
obj.luxian() # 先去南海观音,再去天涯海角

# (2) 实例化对象动态的添加公有成员属性和方法
obj.didian = "西藏"
print(obj.didian) # 西藏

# 通过__dict__可以查看对象或者类里面的成员,返回一个字典
print(obj.__dict__) # {'didian': '西藏'}

3.2 通过对象添加成员方法, 一共有三种方法

# 方法一: 动态添加无参方法
def nanhai():
    print("南海观音真雄伟,让人惊叹!")
# 通过对象.属性(自定义的) = 方法 添加
obj.nanhai = nanhai
obj.nanhai() # 南海观音真雄伟,让人惊叹!

# 方法二: 动态添加有参方法
# 形式一:
def menpiao(price):
    print("进门票价{}元".format(price))
obj.menpiao = menpiao
obj.menpiao(160) # 进门票价160元

# 形式二:
def menpiao(obj,price):
    print("进门票价{}元,地点是{}".format(price,obj.didian))
obj.menpiao = menpiao
obj.menpiao(obj,160)  # 进门票价160元,地点是西藏

# 形式三: 通过types.MethodType来创建一个方法,自动传递obj对象
import types   #(推荐)
def menpiao(self,price):
    print("进门票价{}元,地点是{}".format(price,self.didian))
obj.menpiao = types.MethodType(menpiao,obj)  # 调用此方法时,自动把对象当做参数传递给该方法
obj.menpiao(180) # 进门票价180元,地点是西藏

# 方法三: 动态添加lambda匿名函数
obj.money = lambda : print("一共准备5万")
obj.money() # 一共准备5万

4. 类的相关操作: 访问公有的属性和方法,动态的添加方法

class Travel():
    didian = "海南"   # 公有属性
    __jiudian = "海韵"  # 私有属性
    def luxian():      # 公有无参方法
        print("先去南海观音,再去天涯海角")
    def __shijian():  # 私有无参方法
        print("明天启程")

# (1)定义的类访问共有成员和方法,若访问私有的会报错
print(Travel.didian) # 海南
Travel.luxian() # 先去南海观音,再去天涯海角

# (2) 定义的类动态的添加公有的属性和方法
# 方法一: 动态的添加无参方法
def shan():
    print("去桂林看山")
Travel.shan = shan
Travel.shan() # 去桂林看山

# 方法二: 动态的添加有参方法
def shui(name):
    print("去看看{}".format(name))
Travel.shui = shui
Travel.shui("西湖") # 去看看西湖

# 方法三: 动态的添加lambda匿名函数
Travel.cao = lambda : print("去西藏看大草原")
Travel.cao() # 去西藏看大草原

Travel.visit = lambda name : print("一起看世界,和{}".format(name))
Travel.visit("喜欢的人") # 一起看世界,和喜欢的人

* 类与对象的区别: 类里面的成员只归属于类本身, 对象可以调用类里面公有的属性和方法,但是不能修改, 对象在调用成员时,先查找自己本身有没有这个成员,没有的话再从类里面找, 如果类里面也没有,程序报错. 类无法调用对象里面的成员.

5. 查看私有成员: 两种方法

class Travel():
    didian = "海南"   # 公有属性
    __jiudian = "海韵"  # 私有属性
    def luxian():      # 公有无参方法
        print("先去南海观音,再去天涯海角")
    def __tongxing():  # 私有无参方法
        print("不能透露")
    def shijian(self):  # 公有有参方法
        print("明天启程")
    def __fanghao(self):
        print("我会告诉你是888号吗?")
obj = Travel()

# 方法一: 根据python存私有变量的规律[_类名__成员名](不推荐)
print(obj._Travel__jiudian) # 海韵
obj._Travel__fanghao() # 我会告诉你是888号吗?

print(Travel._Travel__jiudian)
Travel._Travel__tongxing() # 不能透露

# 方式二: 通过类内的共有方法间接调用私有成员(推荐) class Travel(): didian = "海南" # 公有属性 __jiudian = "海韵" # 私有属性 def luxian(): # 公有无参方法 print("先去南海观音,再去天涯海角") def __tongxing(): # 私有无参方法 print("不能透露") def shijian(self): # 公有有参方法 print("明天启程") def __fanghao(self): print("我会告诉你是888号吗?") def fangfa(self): print(self.__jiudian) self.__fanghao() def fangfa2(): print(Travel.__jiudian) Travel.__tongxing() obj = Travel() obj.fangfa() # 海韵 我会告诉你是888号吗? Travel.fangfa2() # 海韵 不能透露

6. 删除相关成员:  实例化的对象删除公有的属性和方法, 定义的类删除公有的成员和方法

class Travel():
    didian = "海南"   # 公有属性
    __jiudian = "海韵"  # 私有属性
    def luxian():      # 公有无参方法
        print("先去南海观音,再去天涯海角")
    def __tongxing():  # 私有无参方法
        print("不能透露")
    def shijian(self):  # 公有有参方法
        print("明天启程")
    def __fanghao(self):
        print("我会告诉你是888号吗?")
    def fangfa(self):
        print(self.__jiudian)
        self.__fanghao()
    def fangfa2():
        print(Travel.__jiudian)
        Travel.__tongxing()
obj = Travel()

# 实例化的对象删除公有的属性和方法
obj.didian = "上海"
print(obj.didian) # 上海
del obj.didian
print(obj.didian) # 海南

obj.zou = lambda : print("说走就走")
obj.zou() # 说走就走
del obj.zou
# obj.zou()  # 报错,因为方法已删除

# 定义的类删除公有的成员和方法
del Travel.didian
# print(Travel.didian)  # 报错

del Travel.luxian
# Travel.luxian()  # 报错

del Travel.__fanghao  # 报错

7. __init__构造方法:  在实例化对象,初始化的时候触发,功能是可以为对象添加成员,参数至少有一个self,无返回值

class Travel():
    def __init__(self,didian):
        self.didian = didian
# 实例化
obj = Travel("海南")
print(obj.didian) # 海南

# 可以通过一个类实例化不同的对象
class Travel():
    def __init__(self,didian,time):
        self.didian = didian
        self.time = time

    def shan(self):
        print("山:{}去{}玩".format(self.time,self.didian))

    def shui(self):
        print("水:{}去{}玩".format(self.time, self.didian))

    def hai(self):
        print("海:{}去{}玩".format(self.time,self.didian))

# 第一个对象:
wudangshan = Travel("湖北","5月")
wudangshan.shan() # 山:5月去湖北玩

# 第二个对象:
xihu = Travel("杭州","6月")
xihu.shui() # 水:6月去杭州玩

# 第三个对象
dadonghai = Travel("三亚","7月")
dadonghai.hai() # 海:7月去三亚玩

猜你喜欢

转载自www.cnblogs.com/fdsimin/p/12957123.html