Python面向对象基础

一、前言

其实自己一直都觉得自己的编程代码能力是很垃圾的,事实也的确如此,算法算法不会,开发开发不会...今天和同学交流了一些代码。发现果然自己真的很菜啊。那就巩固一下基础吧.很久没碰,这都全忘了呀。

二、类和对象

什么是类,什么是对象。对象是类定义来的,类是无实际数据的。就是一个对象的模版。还是不懂对吧。简单来说,就是类是爸爸,对象是儿子。儿子就是爸爸这个模样刻出来的。还不懂是吧?比喻:人,就是一个类,动物也是一个类,那么对象就是。张三,李四,狗,猫。
然后类和对象之间会有一个关系叫做实例化。比如,张三 是 人 这个类的 实例对象。简单来说,张三是人的实例。
那在其他语言中,实例化一个对象,通常是 new,比如PHP:
$a = new test();
而在Python中,则是直接实例化调用。

class people:
	count = 0  #类属性
	def __init__(self,name,age):
		self.name = name #对象属性
		self.age = age
		people.count +=1
	
	def who(self):
		print(f"{self.name} is {self.age} years old.")
	
zhangsan = people("张三","80")
xiaomin = people("小名","90")
zhangsan.who()
xiaomin.who()
print(xiaoin.count)

输出:

张三 is 80 years old.
小名 is 90 years old.
2

获取类属性和实例对象属性

class people:
    count = 0

    def __init__(self, name, age,count):
        self.name = name
        self.age = age
        self.count = count
        people.count += 1

    def getinfo(self):
        print(f"{self.name} is {self.age} years old.")

    def get_class_count(self):
        print("类的属性count:",people.count)

    def get_intance_count(self):
        print("实例对象count",self.count)

zhangsan = people("张三", "80",999)
xiaomin = people("小名", "90",999)

print()

如果使用self.count,会先去找实例对象的属性,如果没有就会去找类属性。所以相要获取正确的类属性,应该直接调用people.count,但是如果是在外部就得换个方式表达。
zhangsan.__class__代表的就是people类,那么就是zhangsan.__class__.count就是寻求类的count属性。

print(zhangsan.__class__)  #获取对象的类
print(people.__base__) #获取类的父类

输出为:
<class '__main__.people'>
<class 'object'>

还有一些内置方法,例如__name__

print(zhangsan.__class__.__name__)
print(people.__base__.__name__)
输出为:
people
object

私有属性

私有属性就是只在类的内部调用,在外部不允许调用,设置方式为在属性前面加 __ 双下划线。比如__name

class people:

    count = 0
    __secretcount =999

    def __init__(self):
        self.count+=1


    def get_count(self):

        print("公共属性",self.count)

    def get_secret_count(self):

        print("私有属性:",self.__secretcount)

zhangsan = people()
zhangsan.get_count()
zhangsan.get_secret_count()
print(zhangsan.count)
print(zhangsan.__secretcount)

这里的输出就是:
image

三、继承

一个类可以继承另一个类。
calss chilld(people):
这样child类就会继承people的所有属性和方法。当子类需要新的对象属性的时候,就需要调用父类的初始函数,使用
super().__init__(name,age)调用函数。其中super就是指父类

class people:
    peoplecount = 0
    def __init__(self,name,age):
        self.name = name
        self.age = age
        people.peoplecount +=1

    def get_info(self):
        print(f"{self.name} is {self.age} ")
    def get_admin(self):

        print("admin")

class  child(people):

    def __init__(self,name,age,admin):
        super().__init__(name,age)
        self.admin = admin
    def get_name(self):

        print(self.name)

    def get(self):
        self.get_admin()

    def get_admin(self):

        print("get_admin被重写了")

zhangsan = child("zhangsan",90,"no")

bob = people("bob",80)

zhangsan.get_name()
zhangsan.get_admin()
zhangsan.get_info()
bob.get_admin()
print(bob.peoplecount)
输出:
zhangsan
get_admin被重写了
zhangsan is 90 
admin
2

四、类的实践练习

题目一

小明和小美都爱跑步
小明体重 75 公斤
小美体重 45 公斤
每次跑步会减肥 0.5 公斤
每次吃东西体重增加 1 公斤
输入
体重 跑步次数 吃东西次数
输出
体重

解释:两个都是人,都有共同的特点。所以可以归于一个类。

class People:

    def __init__(self,name,weight):
        self.weight = weight
        self.name = name

    def run(self):
        print(f"{self.name}跑步了,体重降了0.5")
        self.weight -=0.5
    def eat(self):
        print(f"{self.name}吃饭了,体重增长了1")
        self.weight +=1

    def __str__(self):
        return f"{self.name}的体重是{self.weight}"




xiaomin =People("小明",90)
honhon = People("红红",80)

xiaomin.run()
honhon.eat()
xiaomin.eat()
honhon.run()

print(xiaomin)
print(honhon)
输出:
小明跑步了,体重降了0.5
红红吃饭了,体重增长了1
小明吃饭了,体重增长了1
红红跑步了,体重降了0.5
小明的体重是90.5
红红的体重是80.5

题目二

输出下面的信息。

小明,10岁,男,上山去砍柴

小明,10岁,男,开车去东北

小明,10岁,男,最爱大保健

老李,90岁,男,上山去砍柴

老李,90岁,男,开车去东北

老李,90岁,男,最爱大保健


class People:
    def __init__(self,name,age,sex):

        self.name = name

        self.age = age
        self.sex = sex

    def Doing(self,what):

        print(f"{self.name},{self.age}岁,{self.sex},{what}")


xiaomin =People("小明",10,"男")
xiaomin.Doing("上山去砍柴")
xiaomin.Doing("开车去东北")
xiaomin.Doing("最爱大宝宝")

laoli = People("老李",90,"男")
laoli.Doing("死了")

题目三

房子(House)有户型、总面积、家具名称列表;新房子没有任何的家具 
家具(HouseItem)有名字、占地面积
席梦思(bed) 占地 4 平米
衣柜(bed) 占地 2 平米
餐桌(bed) 占地 1.5 平米
将以上三个家具添加到房子中
打印房子时,要求输出:户型、总面积、剩余面积、家具名称列表

class House:

    Houseitems =[]
    all_sqr = 0
    now_sqr = 0

    def __init__(self,house_type,all_sqr):
        self.house_type = house_type
        House.all_sqr = all_sqr
        House.now_sqr = all_sqr

    def add_items(self,item):
        self.Houseitems.append(item.name)
        self.now_sqr -=item.sqr

    def __str__(self):
        return (f'''户型:{self.house_type}
总面积:{self.all_sqr}
实用面积:{self.now_sqr}
家具列表:{self.Houseitems}
'''
)

class Houseitem:

    def __init__(self,item_name,itme_sqr):
        self.name = item_name
        self.sqr = itme_sqr

House1 = House("120传统宅子",120)

bed = Houseitem("席梦思",4)
guizi = Houseitem("衣柜",2)
desk = Houseitem("餐桌",1.5)

House1.add_items(bed)
House1.add_items(guizi)
House1.add_items(desk)

print(House1)

posted @ 2024-05-29 21:55  云岛夜川川  阅读(7)  评论(0编辑  收藏  举报