'''
面向对象:
程序 现实中
对象----------->具体的事物(水杯,电话等)
现实中的一个事物----->电脑中的程序
世间万物皆是对象
好处:
类似一个函数,但是把事物综合了起来,达到了复用,灵活性更加高了,注重的是一个事物
面向过程(放大象进冰箱)1.开冰箱 2.放大象 3.关冰箱
冰箱是一个对象,大象是一个对象。如果其中一个出问题了只需要改其中一个就可以
面向对象:
类
对象
属性
方法
对象:
小明的手机
小张的手机
小赵的手机等....
这是对象的集合---->提取出一个共性:手机------>作为一个类别出现------>手机类(动作:打电话,发短信,上网,游戏 共性:型号,价格,颜色)
学生类:
特征:姓名,年龄,性别,身高,血型,婚否-------->属性
动作:刷抖音,敲代码,看书,--------->方法
多个对象提取他们的共同的特征和动作把他给封装到一个类当中
这就是一个完整的面向对象的一个过程
接下来定义一个手机类 (先通过对象写类,还是先写类。)----->先出类,先有需求
'''
# 所有的类型首字母大写,多个单词使用驼峰式命名
# 一般都是要继承它的祖先,单纯有特征没有动作不是一个完整的类
# class 类型[(它的父类)]:
# 属性:特征
# 方法:动作
# class Phone:
# # brand = '华为'
# #
# #
# # print(Phone) # <class '__main__.Phone'>
# #
# # yp = Phone() # 使用类创建对象 在类型后面加()表示创建对象
# # ff = Phone() # 使用类创建对象
# # print(yp) # <__main__.Phone object at 0x034500E8>
# # print(yp.brand) # 华为
# # yp.brand = 'mac' # 修改yp的brand的属性
# # print(yp.brand) # mac
# 定义类和属性
# class Student():
# # 类属性
# name = '小伟'
# age = '12'
#
#
# # 使用类来创建对象
# xiaoming = Student()
# print(xiaoming.age)
# xiaoming.age = '123' # 这是对象的属性,而且是动态操作,一个赋值操作改变的是xiaoming这个对象里面的东西进行修改
# # 流程是先找自己空间里面的,然后再找类中寻找
# Student.age = '155' # 修改类中的属性
# ------------------------------------------------------------------------------------------------------------
# 类中的方法:动作
# 普通方法,类方法,静态方法,魔术方法
# '''
# 如何定义个普通方法:
# def 方法名(self,[],[],[],[参数]):
# pass
# '''
# class Phone():
# brand = '小米'
# price = 1999
# type = 'k20pro'
# # 类里面的方法
# def call(self):
# print('正在打电话')
# print('请留言', self.note)
#
#
#
# phone1 = Phone()
# phone1.note = 'zhzhzhzhzhz'
# phone1.call() # 这边要注意先后顺序,要先给note赋值
# 函数和 类里面的定义的:方法
# def func():
# print('--->', name)
#
# username = 'zzh'
# func()username
# def func(names):
# for name in names:
# print(name)
#
# name = ['aa','bb','cc']
# func(name)
# class Phone():
# def call(self): 是不断发生改变的
# print('ssss', self.XXX) 这个不能保证每一个都有
# #使用魔术方法之一: def __init__(self): init初始的
# pass 可以解决这个问题
# pass
#
# p = Phone()
# p.call() 这里不用参数是因为把自己的地址作为一个参数直接传入了self
# ------------------------------------------------------------------------------------
# class Phone():
# def __init__(self):
# self.brand = input('输入你的手机的品牌')
# self.price = int(input('输入你手机的价格'))
#
# def func(self):
# print('价格是', self.price)
# print('品牌是', self.brand)
#
#
# p = Phone() # zz
# p.func() # 价格是 10000 价格是 10000
'''
1.找有没有一个空间名字叫phone
2.利用phone这个类创建一块内存,和phone一模一样的空间 0X1231564AS5D1ASD456这样的
3.**造完空间了,就回到类(Phone)里面去看,有没有魔术方法,如果没有就执行下面的动作,把开辟的空间给了对象P
4.如果有__init__,就是进入__init__,执行里面的动作此时的__init__里面的self是0X1231564AS5D1ASD456
5.最后把0X1231564AS5D1ASD456赋值给对象P
'''
# 方法一:class Phone():
# def __init__(self):
# self.brand = input('输入你的手机的品牌')
# self.price = int(input('输入你手机的价格'))
# 方法二:class Phone():
# def __init__(self, brand, price):
# self.brand = brand
# self.price = price
# 尝试:
# def input1():
# global name, age
# name = input("输入你的name")
# age = input('输入你的年龄')
#
# class Phone():
# def __init__(self, name, age):
# self.name = name
# self.age = age
#
# def print(self):
# print('00', self.name)
# print('01', self.age)
#
# input1()
# p1 = Phone(name,age)
# p1.print() # 可行,这样就有了一个交互的能力
# ------------------------------------------------------------------------------------
# 猫
# class Cat():
# type = '猫'
#
# def __init__(self):
# self.name = input('输入你的猫的名字')
# self.age = int(input('输入你的猫的年龄'))
# self.color = input('输入你的猫的颜色')
#
# def food(self):
# food = input('输入你的猫喜欢吃什么')
# print('{}喜欢吃{}'.format(self.name, food))
#
# def catch_mouse(self, weight, color):
# print('{}抓了一个{}kg的{}的老鼠'.format(self.name, weight, color))
#
# def sleep(self, hour):
# if hour > 8:
# print('{}睡了{}小时已经睡够了'.format(self.name, hour))
# else:
# print('还没睡够呢')
#
# def show(self):
# print('{}的详细信息'.format(self.name))
# print('**' * 10)
# print('{}
{}
{}
{}
'.format(self.name, self.age, self.type, self.color))
#
#
# cat1 = Cat()
# cat1.catch_mouse(18, 'red')
# cat1.show()
# cat1.sleep(99)
# cat1.food()
# -------------------------------------------------------------------------------------------------
# 类方法
'''
特点:
1.定义需要依赖装饰器@classmethod
2.类方法中的参数不是对象了,而是当前类 print(cls) # <class '__main__.Dog'>
3.类方法中只可以使用类属性,不能使用对象属性
4.在对象创建之前类方法就能调用,他是class创建完之后就直接有的一个东西
5.类方法中可否使用它的普通方法(不可以的) 普通方法需要self,也就是说有self的类不能使用
类方法的作用,只能访问类属性,可以用类方法做一些对象没有生成之前的事情,例如:计时间,进程分布,等
'''
class Dog():
def __init__(self, nickname):
self.nickname = nickname
def run(self): # 依赖于对象
print('{}在院子里面跑来跑去'.format(self.nickname))
@classmethod # 这就是一个类方法。有么有对象都会使用的,依赖的是类,里面不能出现self属性
def test(cls): # cls = class
print(cls) # <class '__main__.Dog'>
# print(cls.nickname) # AttributeError: type object 'Dog' has no attribute 'nickname'
dog1 = Dog('zzzz')
dog1.run()
dog1.test()