Python:类和对象的详细分析

类,它是抽象的,是一个整体,是一个全局,比如全人类

对象,这是一个具体的,是一个个体,局部,比如小明

对象是从类中分离出来的一个具体的个体,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.height<self.height:
            print('我不喜欢个子比我低的男生')
            return
        if other.yaowei>1.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掉。大家可以多换几组数据,看看如何才能让对方都成为自己的心仪对象呢,快来试试吧!!!

猜你喜欢

转载自blog.csdn.net/qq_42543244/article/details/81106097
今日推荐