返回顶部

zhangfd

个人博客,仅供学习使用

导航

类和对象

1、类和对象

类有类名、属性和方法

1.1 类的定义和对象创建

## 定义类,类的三要素,类名,类属性,类方法
class Cat:			## 此处不执行,只定义,类名为Cat

    ## 属性 即变量,在外面定义,也可以使用__init__方法接收实参
    ## 初始化对象,__init__(self)方法,默认自动调用
    def __init__(self,name,age):
        self.name = name
        self.age = age

    ## 可以直接调用对象,必须有return,如使用print(tom)调用
    def __str__(self):
        return "str测试 %s 的年龄是%d"%(self.name,self.age)
    
    
    ## 方法
    def eat(self):
        print("猫在吃鱼 ....")
        
    def drink(self):
        print("猫在喝水 ....")

    ## self的功能,用作接收对象
    def introduce(self):
        # print('%s 的年龄是%d'%(tom.name,tom.age))
        print('%s 的年龄是%d'%(self.name,self.age))
        
## 创建对象
# tom = Cat()        ## 执行Cat(),返回对象的引用,使用tom指向该引用
tom = Cat("汤姆",40)
print(tom)

## 调用tom指向对象中的方法 
tom.eat()          
tom.drink()

## 给tom指向的对象添加两个属性
# tom.name = '汤姆'
# tom.age = 40

# 调用属性,self的使用
# print('%s 的年龄是%d'%(tom.name,tom.age))
tom.introduce() ## 相当于 tom.introduce(tom)

## 总结
lanmao =Cat("蓝猫",10)	## class Cat  +  def __init__
print(lanmao)		## def __str__
lanmao.eat()		## def eat
lanmao.drink()		## def drink
lanmao.introduce()	## def introduce

2、类的案例

2.1 给房子加入家具,对应减少可用面积

## 类的案例:给房子加入家具,对应减少可用面积

class Home:
    def __init__(self,new_area,new_info,new_address):
        self.area = new_area
        self.info = new_info
        self.address = new_address
        self.left_area = new_area
        self.container_item = []
    
    def __str__(self):
        msg =  "房子面积:%d平米,可用面积:%d,户型信息:%s ,房子地址:%s"%(self.area,self.left_area,self.info,self.address)
        msg += "包含家具:%s"%(str(self.container_item))
        return msg

    def add_jiaju(self,item):
        # self.left_area -= item.area
        # self.container_item.append(item.name)  ## 注意:能直接获取变量值的,都应该改为函数调用,应为item可能不会返回给你值
        self.left_area -= item.get_area()
        self.container_item.append(item.get_name())


class JIAJU:
    def __init__(self,new_name,new_area):
        self.name = new_name
        self.area = new_area
    
    def __str__(self):
        return "家具:%s,占用面积:%d 平米"%(self.name,self.area)

    def get_area(self):
        return self.area
    
    def get_name(self):
        return self.name    ## 我自己可以决定是否返回,控制权限

## 实例化房子fangzi
fangzi = Home(120,"三室一厅","上海市浦东新区金桥镇")

## 实例化席梦思ximengsi
ximengsi = JIAJU("席梦思",4)

## 房子加入家具-席梦思
fangzi.add_jiaju(ximengsi)
print(fangzi)

## 房子加入家具-冰箱
bingxiang = JIAJU("冰箱",1)
fangzi.add_jiaju(bingxiang)
print(fangzi)

3、隐藏属性(私有属性)

3.1 用函数对变量的控制

class Dog:
    def set_age(self,new_age):
        if new_age >= 0 and new_age <= 100:
            self.age = new_age
        else :
            self.age = 0

    def get_age(self):
        return self.age

dog = Dog()
dog.set_age(-1)
age = dog.get_age()
print(age)

4、私有方法

class Msg:
    ## 私有方法
    def __send_msg(self):		## __开头的自定义方法,叫私有方法,类以外的函数不能调用
        print("--------短信发送中------")
	## 公有方法
    def send_msg(self,new_money):	
        if new_money >= 10000:
            self.__send_msg()	## 满足条件时,内部调用私有方法
        else:
            print("余额不足,请充值")

msg = Msg()
msg.send_msg(13330)

5、类的继承和重写

class Animal:        ## 定义类
    def __init__(self):
        self.name='zhangsan'
        self.__age=40
    
    def __info(self):       ## 私有方法
        print(self.name)
        print(self.__age)

    def info(self):       ## 公有方法
        print(self.name)
        print(self.__age)
    
    def eat(self):
        print("------吃------")
    def drink(self):
        print("------喝------")
    def sleep(self):
        print("------睡------")
    def run(self):
        print("------跑------")

class Dog(Animal):  ## 定义子类,继承Animal
    def wangwang(self):
        print("-----汪汪汪------")

class Xiaotq(Dog):  ## 继承Dog类
    def fly(self):
        print("-------飞-----")
    
    def wangwang(self):             ## 重写方法,不使用父类的方法
        print("-----狂吠------")
        ## 调用父类方法1
        # Dog.wangwang(self)          ## 调用父类的方法,必须带有self
        ## 调用父类方法2
        super().wangwang()            ## 注意super()

xiaotq = Xiaotq()
xiaotq.fly()
xiaotq.wangwang()
xiaotq.eat()
# xiaotq.__info()   ## 不能继承私有方法
xiaotq.info()       ## 能通过该类的公有方法去调用私有属性和方法
print(xiaotq.name)  ## 能继承公有属性
# print(xiaotq.__age) ## 不能继承私有属性

6、类属性,类方法,实例方法,静态方法及调用

  • 一个程序中尽量使用类或函数中的其中一种
  • 推荐使用类,要用到函数时,用静态方法代替函数
  • 函数放到类中叫实例方法,@staticmethod标识的叫做静态方法
class Tools(object):
    ## 类属性
    num = 0

    ## 实例方法,必须要参数self
    def __init__(self,new_name):
        ## 实例属性
        self.name = new_name
        ## 实例中使用类属性,需要加上类名
        Tools.num += 1
    
    ## 类方法,必须要参数,cls
    @classmethod
    def add_num(cls):
        cls.num = 100

    ## 静态方法,可以没有参数,等同于函数
    @staticmethod
    def print_menu():
        print("------------")
        print("-- 穿越火线1.1 --")
        print("- 开始游戏 -")
        print("- 结束游戏 -")
        print("------------")

tool1 = Tools("铁锹")
tool2 = Tools("锄头")
tool3 = Tools("火钳")
print(tool1.num)        ## 实例调用实例属性

## 调用类属性
Tools.add_num()         ## 直接使用类名调用类属性
print(Tools.num)

tool = Tools("")        ## 创建对象
tool.add_num()          ## 类对象调用类方法
print(Tools.num)

## 调用静态方法
Tools.print_menu()      ## 通过类名直接调用
tool.print_menu()       ## 通过对象调用静态方法

posted on 2020-07-11 19:13  zhangfd  阅读(176)  评论(0编辑  收藏  举报