类,它是抽象的,是一个整体,是一个全局,比如全人类
对象,这是一个具体的,是一个个体,局部,比如小明
对象是从类中分离出来的一个具体的个体,Python是面向对象的语言
object,任何的一个对象都直接或者间接继承自object。从功能上定义,类是属性和方法的结合。
类相当于模板,对象就相当于模板生成的产品。
class Hero(object): #Hero为一个类
blood=700
attact=67 # 属性
level=1
def skill(self): #方法函数
print('致盲射击')
timo=Hero() #创建一个对象timo,属于类hero
timo.skill()
print(Hero.blood)
print(timo.blood)
print(Hero.skill)
点击运行,输出结果为:致盲射击;700;700。能很直观清楚的看到类和对象的构成。
class People(object):
count=0 # 当对象创建的时候,默认的属性值
def __init__(self,name,sex,age): # init初始化
self.name=name # 对象创建的时候会自动调用init方法,如果init方法需要参数的话
# 那么在创建的时候也需要参数
self.sex=sex
self.age=age
def sleep(self): #对象方法
print('{}一天要睡十个小时'.format(self.name))
zhang_san=People('张三','男','17')
zhang_san.sleep()
print(People.count)
点击运行,输出结果为:张三一天要睡十个小时;0 ,我们后面写类和对象的时候绝大部分都会用这种方式。
1.基本的类和对象的调用
【1】
class Dog(object):
def __init__(self,name,age):
self.name=name
self.age=age
def sit(self):
print(self.name+"今年"+self.age+'岁了')
benben=Dog('笨笨','3')
benben.sit() #对象调动输出
Dog.sit(benben) #类调动输出
点击运行,输出的结果为:笨笨今年3岁了;笨笨今年3岁了。两种的输出方法,一种是对象调用函数输出,一种是类调用函数输出。
【2】
class Car():
def __init__(self,make,model,year):
self.make=make
self.model=model
self.year=year
def get_descriptive_name(self):
long_name=str(self.year)+''+self.make+''+self.model
return long_name
my_new_car=Car('奥迪','a4','2016')
print(my_new_car.get_descriptive_name())
print(Car.get_descriptive_name(my_new_car))
点击运行,输出结果为:2016奥迪a4; 2016奥迪a4。这种方式的输出就是用return返回值,来输出。以上两个是调用的两种方式
【3】
class Car(object):
def __init__(self,make,model,year,odometer_reading):
self.make=make
self.model=model
self.year=year
self.odometer_reading=odometer_reading
def read_odometer(self):
print("这个车跑了"+str(self.odometer_reading)+"公里")
my_new_car=Car('audi','a4',2016,30)
my_new_car.read_odometer()
my_new_car.odometer_reading=23 #直接更改属性的值
my_new_car.read_odometer()
点击运行,输出结果为:这个车跑了30公里;这个车跑了23公里。
2.继承类问题
【1】
继承类的问题,顾名思义,有一个父类,有一个或多个子类,子类会有父类的属性和方法,子类也可以改写继承父类的属性和方法,子类也可以拥有自己独特的属性和方法。
class Dog(object):
def __init__(self,name,sex,age,color,size):
self.name=name
self.sex=sex
self.age=age
self.color=color
self.size=size
def sit(self):
print('很安静快速的坐下')
def jump(self):
print('跳的还挺高的')
class dog1(Dog):
def __init__(self,name,sex,age,color,size,eat):
super(dog1,self).__init__(name,sex,age,color,size)
self.eat=eat
def sit(self):
super(dog1,self).sit() #如果不想更改继承的父类,就不用写。
print('喜欢动,坐不下') #更改之后就相当于改变继承的内容,成为自己独有的内容
def jump(self): #将继承的原属性内容与修改后的内容一同输出
super(dog1,self).jump()
print('吃太胖,跳不起来')
xiaobai=dog1('小白',True,6,'白色','哈士奇','火腿')
xiaobai.sit()
xiaobai.jump()
print(xiaobai.eat)
Dog.sit(xiaobai) #更改过后继承的属性不能再用类方法调用,类方法调用的是父类自己本身的
Dog.jump(xiaobai) #而不是子类继承它并且修改过的
点击运行,输出结果为:很安静快速的坐下;喜欢动,坐不下;跳的还挺高的;吃太胖,跳不起来;火腿;很安静快速的坐下
;跳的还挺高的 。我们来认真的解析这段代码,从而搞清楚继承的问题。
在这里,第一行class Dog(object)。Dog(object)就为父类或是祖类。然后写了三个方法,分别是init,sit,jump。init方法中有五种属性,name,sex,age,color,size。然后又重新建立一个类,名字叫做dog1,也同样有三个函数,init,sit,jump。init方法里面有六种属性,name,sex,age,color,size,eat。然后用super(dog1,self).__init__(name,sex,age,color,size),这行代码的意思就是这个五个属性去继承Dog类中init的五个属性,eat是dog1单独的一个属性,是自己独有的。同样,dog1类中,sit,jump两种方法也继承于Dog中sit,jump的两种方法。最后,建立一个实例化的对象,xiaobai=dog1('小白',Ture,6,'白色','哈士奇','火腿')。第一个输出xiaobai.sit(),第一个输出的值是,很安静快速的坐下;喜欢动,坐不下。第一个是继承而来的,第二个是继承后修改之后的。第二个输出与这一个同理。第三个,print(xiaobai.eat)这个就是输出的子类dog1自己独有的属性,输出火腿。最后两个是用父类Dog调用函数,可以看出来,输出的结果只有父类本身的定义内容,而不能输出子类dog1继承后修改过的内容。由此可见,子类更改过后继承的属性 是不能用父类方法调用的,调用只能调用父类本身的。
【2】
class People(object):
def __init__(self,name,age,height,eat):
self.name=name
self.age=age
self.height=height
self.eat=eat
def jump(self):
result='垂直跳离地一米'
return result
def run(self):
result='跑的比豹子都快'
return result
class Man(People):
def __init__(self,name,age,height,eat,huzi):
super(Man,self).__init__(name,age,height,eat)
self.huzi=huzi
def jump(self):
mes='他立定能跳4米'
return mes
def run(self):
mes='一百一十米跨栏冠军,亚洲飞人'
return mes
liuxiang=Man('刘翔',30 ,1.85,'营养餐','短胡子')
print(liuxiang.jump())
print(liuxiang.run())
print(People.run(liuxiang))
print(People.jump(liuxiang))
点击运行,输出结果为:他立定能跳4米;一百一十米跨栏冠军,亚洲飞人;跑的比豹子都快;垂直跳离地一米。这个编程其实就不用做过多的详解了。这种方法其实就是用return返回一个值,然后调用的时候,用print输出就可以完成了。这个和第一种方式,根据个人喜好来选择要使用的方式。
3.类,私有属性与get和set方法。
【1】私有属性
class Human(object):
def __init__(self,name,age,height,fond):
self.name=name
self._age=age
self.__height=height
self.___fond=fond
xiaoming=Human('小明',18,175,'LOL')
print(xiaoming.name)
print(xiaoming._age)
print(xiaoming._Human__height)
print(xiaoming._Human___fond)
点击运行,输出结果为:小明;18;175;LOL。第一个name属性,这是我们最常见的类型;当age前加上_ ,变成_age,这个就成为了私有属性,虽然这种属性,在输出时与平常一样,但是当加上这个下划线的时候,就代表别人不想让你去访问这个属性,当加上__或___时,这个时候就代表这个属性别人是非常不希望你去访问的。但不代表我们就没有办法去访问,但我们站在道德的层面上就最好不要去访问,如果想访问,就用上述的代码的后两行方式进行访问。
【2】get,set方法
class Human(object):
def __init__(self,name,age,height,fond):
self.name=name
self._age=age
self.__height=height
self.___fond=fond
@property
def height(self):
return self.__height
@property
def fond(self):
return self.___fond
@height.setter
def height(self,height):
self.__height=height
@fond.setter
def fond(self,fond):
self.___fond=fond
p1=Human('小明',18,178,'吃鸡')
print(p1.name,p1._age,p1.height,p1.fond) #get方法,这个是在取值的时候用get方法,set无用,这时候get可以单独使用
#------------------------------------------------------------------------------------------------------------------
p1=Human('大神',20,180,'打篮球') #set方法,这个是在你重新更改设置值得时候,可用,,,set不能单独使用
print(p1.name,p1._age,p1.height,p1.fond)
点击运行,输出结果为:小明 18 178 吃鸡;大神 20 180 打篮球。get与set方法就是在访问私有属性时,除了可以用第一种方式之外,然后就是用这种方式。当在使用的get方法的时候,取值的时候就可以跟我们平常的取值方式一样,这个时候get是可以单独使用的,set是你想重新的去设置值然后得到它,需要去引用。
例题:
男女相亲 男方对女方要求 0.对方必须是女的 1.女方身高不下于165 2.女方年龄不能比自己大 3.女方的腰围一定要比自己小 4.女方读的书不能少于100 女方对男方的要求 0.对方必须是男 1.对方的年龄不能比自己小不能大于自己10岁 2.对方的身高不能比自己小 3.对方的腰围不能超过自己1.5倍 4.男方应有稳定收入,年薪不能少于20W 5.男方房子面积不能少于120,总价值不能少于200W
这个题对于类与对象,继承问题考验的非常全面。编写的代码如下:
class People(object): #创建父类
def __init__(self,name,sex,age,height,yaowei): #设置父类属性
self.name=name
self.sex=sex
self.age=age
self.height=height
self.yaowei=yaowei
def sexIsFit(self,other): #在父类中判断性别情况
if self.sex==True and other.sex==True:
print('你是女的,我也是女的,GG')
return False
if self.sex==False and other.sex==False:
print('你是男的,我也是男的,GG')
return False
def ageIsFit(self ,other): #在父类中判断年龄大小问题
if self.sex == True and self.age > other.age :
print('小弟弟,你还太小')
return False
if self.sex == False and self.age < other.age:
print('大姐姐,你年龄太大')
return False
class Man(People): #创建子类Man,继承自people
def __init__(self,name,sex,age,height,yaowei,money,house_area,house_value):#Man拥有的属性
super(Man, self).__init__(name,sex,age,height,yaowei )#Man继承父类People的属性
self.money=money
self.house_area=house_area
self.house_value=house_value
def makeFriendWithGirl(self,other): #男生判断女生的条件是否满足自己的要求
result=super(Man, self).sexIsFit(other)
if result==False:
return
result=super(Man, self).ageIsFit(other)
if result==False:
return
if other.height<165:
print('你的个子低于165,我不要')
return
if other.yaowei>self.yaowei:
print('你的腰比我还粗')
return
if other.book<100:
print('你读的书太少')
return
print('你就是我的女神')
class Woman(People): #创建子类Woman,也继承自People
def __init__(self,name,sex,age,height,yaowei,book): #Woman拥有的属性。
super(Woman, self).__init__(name,sex,age,height,yaowei)#Woman继承父类People的属性
self.book=book
def makeFriendWithBoy(self,other): #女生判断男生的条件是否满足自己的要求
result=super(Woman,self).sexIsFit(other)
if result==False:
return
result=super(Woman,self).ageIsFit(other)
if result==False:
return
if other.age-self.age>10:
print('你大我超过了10岁')
return
if other.height1.5*self.yaowei:
print('你的腰太粗了,我喜欢瘦点的男生')
return
if other.money<20:
print('你挣得钱太少')
return
if other.house_area<120 or other.house_value<200:
print('你的房子面积,资产不行')
return
print('你是我的男神')
p1=Man('小王',False,26,163,30,40,140,300) #创建实例化对象,并添加对应的属性内容
p2=Woman('小丽',True,24,166,22,100)
p1.makeFriendWithGirl(p2) #男生女生之间的相互判断
p2.makeFriendWithBoy(p1)
点击运行,输出的结果为:你就是我的女神;我不喜欢个子比我低的男生。添加的该属性内容,女生的条件完美的符合男生的条件要求,所以,女方小丽是小王的心仪对象,但小王的条件,身高这一块不满足女生小丽提出的条件要求,所以被out掉。大家可以多换几组数据,看看如何才能让对方都成为自己的心仪对象呢,快来试试吧!!!