Python——面向对象

Python——面向对象

参考博文 https://www.cnblogs.com/linhaifeng/articles/6182264.html

一、类

类是用来描述一类事物,类的对象指的是这一类事物中的个体

1、Python的经典类与新式类

在这里插入图片描述

2、如何声明类?

class 类名:
类的文档字符串
类体

例如:

class Chinese:
    "这是一个中国人的类"
    pass

3、类的实例化

p1 = Chinese()  // 类名+()就是一个实例化。由Chinese类产生的对象,实例化会返回一个结果,相当于函数的return

4、属性

事物均有属性,属性分为:
1、数据属性:就是变量
2、函数属性:在面向对象方法里通常称为方法

类和对象均用 来访问自己的属性。例如:

class Chinese:
   "这是一个中国人的类"
   man = "中国男人"
print(Chinese.man)

类的函数属性调用(又称为方法)

class Chinese:
    "这是一个中国人的类"
    man = "中国男人"
    def history():
        print("中国拥有上下五千年的历史")

    def people(self):
        print("%s 是一个中国人"%self)
        
Chinese.history()
people_obj = 'alex'
Chinese.people(people_obj) #带参函数,所以调用时需要传入参数,讲'alex'传给self
4(1)、查看类的属性

定义的类存到了哪里?有两种方式查看

dir(类名):查出的是一个名字列表
类名.__dict __:查出的是一个字典,key为属性名,value为属性值

4(2)、特殊的类属性

在这里插入图片描述

5、构造函数(初始化)

如何为实例定制数据属性?可以使用类的一个内置方法 __init() __ ,该方法,在类()实例化时会自动执行

class Chinese:
    "这是一个中国人的类"
    man = "中国男人"
    def __init__(self,name,age):
        self.name = name
        self.age = age
        # 切记这里不需要写return,此内置方法会自动帮你返回
    
    def history():
        print("中国拥有上下五千年的历史")
    def people(self):
        print("%s 是一个中国人"%self)


person1 = Chinese('alex',18)
person2 = Chinese('Bob',28)

疑问:为什么传参的名字,年龄可以自动对应name,age?为什么__init __里面的self 不用对应?

这两个问题实际是一个问题,这是类的内置方法帮我们做了对应的操作
实际是:

person1 = Chinese.__init__(p1,name,age)

person1 对应了 self,类里面的 name 实际也是 person1.name = name ,以此类推。

疑问:person1这个实例是由Chinese这个类产生的,那,可以调用到 man 这个属性吗
可以,类像函数,__init __ 里面没有 man 这个属性,于是就去到上一层找。

注意:由于实例调用类方法时,类会自动把实例传给类方法,所以类里面每个方法后面都要加(self)

6、类属性的增删改查

类属性又称为静态变量,或者静态数据。这些数据与它们所属的类对象是绑定的,不依赖于任何类实例。在JAVA或C++语言中,相当于在变量声明前加上 static 关键字。

查看类属性
print(Chinese.man)

修改类属性
Chinese.man = '女人'

删除类属性
del Chinese.man

增加类属性
Chinese.woman = "女人"
Chinese.location = "Asia"

7、实例属性的增删改查

注意:实例没有函数属性

查看实例属性
print(person1.name)

增加实例属性
person1.number = 123456

修改实例属性
person1.name = 'aaa'

删除实例属性
del person1.name

切记:不要修改底层的属性字典

8、静态属性

class Room:
    def __init__(self,width,len,heigh):
        self.width = width
        self.len = len
        self.heigh = heigh

    def area(self):
        print('面积为:%s'%(self.width*self.len))

r1 = Room(5,3,6)
r1.area()

上面代码中,我们想要计算面积的时候,需要写 r1.area() ,一看就知道area是函数属性,如果想要隐藏起来,可以加个装饰器 @property

class Room:
    def __init__(self,width,len,heigh):
        self.width = width
        self.len = len
        self.heigh = heigh

    @property
    def area(self):
        return self.width * self.len

r1 = Room(5,3,6)
print(r1.area)

这样,在调用的时候,不需要再加括号,调用者就分不清是数据属性还是函数属性。

9、类方法

class Room:
    lenb = 123
    def __init__(self,width,len,heigh):
        self.width = width
        self.len = len
        self.heigh = heigh

    @classmethod
    def cla(cls):
        print(cls.lenb)
        
Room.cla()

在函数前加个装饰器 @classmethod ,就能直接通过类来调用,且不用传参。

10、静态方法

在函数前加一个装饰器 @staticmethod,静态方法只是名义上归属类管理,不能使用类变量和实例变量,是类的工具包

class Room:
    lenb = 123
    def __init__(self,width,len,heigh):
        self.width = width
        self.len = len
        self.heigh = heigh
        
    @staticmethod
   	def qwe(a,b):
        print("第一个:%s,第二个 :%s" %(a,b))

Room.qwe(1,2)

此函数括号里没有 self ,如果不加这个装饰器,在实例调用此函数时调用不了,会把实例本身传进去。加了此装饰器,实例就能调用,函数也不需要加 self 。

二、组合

1、定义一个类,比如人;人里面也有其他分类,比如人种,性别等等。这几个属性又是可以通过一个类实例化的对象,这就是组合。比如:

class School:
    #学校
    def __init__(self,name,addr):
        self.name = name
        self.addr = addr

class Teacher:
    #老师
    def __init__(self,name,age,School):
        self.name = name
        self.age = age
        self.school = School

class cour:
    #课程
    def __init__(self,name,Teacher,School):
        self.name = name
        self.teacher = Teacher
        self.school = School

比如上述代码,老师中有分哪个校区的老师,课程有分哪个老师教,哪个校区的课程。

未完待续…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值