14.Python的类和对象
目录
一、类
二、对象
三、属性
3.1类属性
3.2对象属性
四、方法
4.1实例方法
4.2类方法
4.3特殊方法
4.4静态方法
五、类的继承
5.1继承
5.2重写
5.3object类
5.4多态
六、私有化
6.1私有属性
6.2私有方法
七、自省与反射机制
7.1自省机制
7.2反射
一、类
定义:
类是多个类似事物组成的群体的统称,能够帮助我们快速理解和判断事物的性质
类就是一种数据类型,自定义类就是为了自定义数据类型
类名由一个或多个单词组成,每个单词的首字母大写,其余小写
语法:
class 类名:属性方法
class Student:"""表示学生"""pass
二、对象
定义:
对象就是某个类的具体的一个实例
对象的创建又称为类的实例化
语法:
实例名=类名()
point = Point()
类和对象的区域:
类是对客观世界中事物得抽象,而对象是类实例化后的实体
例如:汽车模型就是一个类,制造出来的每辆汽车就是一个对象
三、属性
类和对象的特征数据称为属性。
3.1类属性
直接在类中定义的变量,被该类的所有对象所共享,通过类名.类属性/对象.类属性名调用
定义:
class Student:native_place='四川' #类属性,直接写在类里的变量
调用:
类名.类属性
对象.类属性名
print(Student.native_place) # 直接通过类名访问类属性
p=Student() # 创建一个实例
print(p.native_place) # 通过对象访问类属性
3.2对象属性
一般定义在构造方法中,通过句点法对象.对象属性以赋值的方式可以直接定义对象属性 ,为该对象特有的属性,只能通过对象.对象属性进行访问
通过对象访问一个属性的时候,首先找对象本身有没有这个属性,有就返回,若没有则在对象对应的类中寻找相关属性,若类中也无该属性,则报错,所以当对象属性和类属性名重名,只会返回对象属性
定义:
p = Student()
# 通过赋值直接定义对象属性
p.age = 13
调用:
对象.对象属性
print(p.age)
四、方法
定义在类中的函数称为方法。通过调用的方式的不同,分为对象方法,类方法,静态方法和魔术方法。
4.1实例方法
定义在类中的普通方法,一般通过对象调用
定义:
class Student:native_place='四川' #类属性,直接写在类里的变量#实例方法def eat(self): print('实例方法')
调用:
类名.方法名(参数)
对象.方法名(参数)
通过对象调用方法时,对象本身会被隐式的传给方法的第一个参数
stu=Student()
stu.eat() #与Student.eat()功能相同,都是调用Student中的eat方法
Student.eat(stu)
4.2类方法
在普通的方法基础上增加一个classmethod装饰器,不需要对象就能调用
定义:
class Student: #类方法@classmethoddef cm(cls):print('使用classmethod修饰,是类方法')return cls(0,0)
调用:
stu=Student()
stu.cm()
Student.cm()
4.3特殊方法
可以定义一些特殊的方法来实现特殊的功能,也成为魔术方法,一般以双下划线__开头
更多特殊方法:更多特殊方法
定义:
class Student:def __init__(self,name,age): #类的构造函数,用于初始化类的内部状态,为类的属性设置默认值self.name=name #self.name称为实体属性,进行了一个赋值操作,将局部变量的name的值赋给实体属性self.age=age
调用:
stu=Student('jack',20)
print(stu.name)
print(stu.age)
print(Student('haha',23).age)
4.4静态方法
在普通的方法基础上增加一个staticmethod装饰器,不会接收隐式的第一个参数,和普通的函数一样且与类本身无联系,只是被封装到类中
定义:
class Student:@staticmethoddef sum(a,b):return a+b
调用:
print(Student.sum(1,7))
stu=Student()
print(stu.sum(3,5))
五、类的继承
5.1继承
当定义一个类时,可以从现有的类继承,新的类称为子类,被继承的类称为基类/父类
子类可以继承父类的属性和方法,如果一个类没有继承任何类,则默认继承object,python支持多继承,定义子类时,必须在其构造函数中调用父类的构造函数
语法:
class 子类类名(父类1,父类2....)pass
实例:
class Person(object): #Person继承object类def __init__(self,name,age):self.name=nameself.age=agedef info(self):print('姓名:{0},年龄{1}'.format(self.name,self.age))
class Student(Person):def __init__(self,name,age,stu_no):super().__init__(name,age) #继承Person中的属性self.stu_no=stu_no #子类新定义的属性
class Teacher(Person):def __init__(self,name,age,tofyear):super().__init__(name,age) #继承Person中的属性self.tofyear=tofyear #子类新定义的属性
stu=Student('jack',20,1001)
tea=Teacher('mary',34,10)
print(stu.name,stu.stu_no)
print(tea.name,tea.tofyear)
stu.info() #调用父类的方法
tea.info() #调用父类的方法
#多继承
class A(object):pass
class B(object):pass
class C(A,B):pass
5.2重写
子类中定义同名的方法和属性会覆盖父类的方法和属性。如果子类对继承自父类的某个属性或方法不满意,可以在子类中对某(方法体)进行重新编写
子类重写后的方法中可以通过super().xxx()调用父类中被重写的方法
class Person(object): #Person继承object类def __init__(self,name,age):self.name=nameself.age=agedef info(self):print('姓名:{0},年龄{1}'.format(self.name,self.age))
class Student(Person):def __init__(self,name,age,stu_no):super().__init__(name,age)self.stu_no=stu_nodef info(self): #重写父类中info方法super().info()print('学号{}'.format(self.stu_no))def haha(self): #调用父类中info方法super().info()
stu=Student('jack',20,1001)
stu.info()
stu.haha()
5.3object类
object类是所有类的父类,因此所有类都有object类的属性和方法
内置函数dir()可以查看指定对象所有属性
object有一个__str()__方法,用于返回一个对于“对象的描述”,对应于内置函数str()经常用于print()方法,帮我们查看对象的信息,所以我们经常会对str()进行重写
class Student:pass
stu=Student()
print(dir(stu))
print(stu) #默认调用__str__这样发方法
class Student1():def __init__(self,name,age):self.name=nameself.age=agedef __str__(self): #重写__str__return '我的名字是{0},年龄{1}'.format(self.name,self.age)
stu=Student1('jack',20)
print(dir(stu))
print(stu) #默认调用__str__这样发方法
print(type(stu))
5.4多态
用test()函数接收一个对象,并调用对象的eat方法,不检查对象的类型,只关心对象的行为
class Animal(object): #定义各个类中的方法def eat(self):print('动物吃东西')
class Cat(Animal):def eat(self):print('猫吃鱼')
class Dog(Animal):def eat(self):print('狗吃骨头')
class Person(object):def eat(self):print('人吃饭')
class Ha(Animal):pass
def test(a): #定义函数使用eat方法a.eat()
test(Animal()) #调用对应类中的eat方法
test(Cat())
test(Dog())
test(Person())
test(Ha())
六、私有化
在开发过程中,对象的某些属性、方法只想在内部被使用,不想在外部被访问,通过__进行定义。
类的私有属性和私有方法,都不会被子类继承,子类也无法访问。
6.1私有属性
class A:__name='私有属性'
def method2(self):return A.__namedef __init__(self,name,age):self.name=nameself.__age=age
def hah(self):return self.__agea=A('zhangsan',18)
print(a.__age) #直接调用时报错
print(a.hah()) #通过内部方法调用
print(a.__name) #直接调用时报错
print(a.method2()) #通过内部方法调用
6.2私有方法
class A:
def __method1(self):print('我是私有方法')
def method2(self):return self.__method1()
a=A()
a.__method1 #直接调用时报错
a.method2() #通过内部方法调用
七、自省与反射机制
7.1自省机制
自省时一种自我检查行为,检查对象以确定它是什么类型、包含哪些属性、方法。
1.type返回对象的类型
a=1
class ABC:pass
type(a)
type(ABC)
2.dir返回对象的属性、方法名的列表
class Pepole(object):country='china'
def __init__(self,name,age):self.name=nameself.age=age
def test(self):print('这是测试方法')
p=Pepole('zhangsan',18)
print(dir(p))
3.isinstance(obj,class)判断obj是不是一个class的类型
class Pepole(object):country='china'
def __init__(self,name,age):self.name=nameself.age=age
def test(self):print('这是测试方法')
p=Pepole('zhangsan',18)
print(isinstance(p,Pepole))
4.判断issubclass(class,(pclass1,pclass2,....))判断class是否是pclass1,pclass2..中的子类,返回布尔值
class Pepole(object):pass
class Student(Pepole):pass
print(issubclass(Student,(Pepole,int)))
7.2反射
反射是动态的操作对象,简单的讲就是根据字符串形式的属性名、方法名操作对应的对象
1.getattr(obj,name)获取obj里面的属性名为name的属性或方法:
name是字符串,根据字符串获取对应的属性或者方法
class Pepole(object):country='china'
def __init__(self,name,age):self.name=nameself.age=age
def test(self):print('这是测试方法')
def sum(self,a,b):print(a-b)
p=Pepole('zhangsan',14)
#其中country可以用input接收为一个变量,根据变量内容不同可查看不同的属性或方法
res=getattr(p,'country')
print(res)
print(getattr(p,'test'))
getattr(p,'sum')(4,1) #调用该方法
2.setattr(obj,name,value)给obj对象设置一个名为name的属性,值为value:
name是字符串,根据字符串设置对象的属性
class Student(object):country='china'
s=Student()
#其中name、value可以用input接收为变量,根据变量内容不同可方便定义属性
setattr(s,'name','zhangsan')
print(getattr(s,'name'))
setattr(s,'country','ch') #修改原有属性
print(getattr(s,'country'))
3.hasattr(obj,name)判断obj有没有一个叫name的属性:
class Student(object):country='china's=Student()
print(hasattr(s,'country'))
4.delattr(obj,name)从obj里面删除一个叫name的属性:
class Student(object):country='china'name='zhangsan'
s=Student()
print(hasattr(s,'name'))
delattr(Student,'name')
print(hasattr(s,'name'))
14.Python的类和对象相关推荐
- Python基础(类与对象)
Python基础(类与对象) 一.编程的两大思想 面向过程和面向对象 面向过程 面向对象 区别 事物比较简单,可以用线性的思维去解决 事物比较复杂,使用简单的线性思维无法解决 共同点:面向对象和面向过 ...
- Python基础——类与对象
Python基础--类与对象 Python基础--类与对象 类与对象 数据类型 对象 类的创建 创建语法 类的创建 对象的创建 对象调用类中的内容 类属性,类方法,静态方法 类属性 访问类属性 类方法 ...
- Python的类和对象的介绍,定义类和对象,定义实例方法和属性以及Python中的魔法方法
Day09新手小白学python 第九节 Python的类和对象的介绍,定义类和对象,定义实例方法和属性以及Python中的魔法方法 目录 Day09新手小白学python 前言 一.面向对象介绍 二 ...
- python基础(14)之 类和对象
目录 Python类和对象 一.创建类 二.创建对象 三.init() 函数 四.对象方法 五.自参数 六.对象及其属性更改 七.pass语句 Python类和对象 Python 类/对象.Pytho ...
- python的类和对象_Python类与对象实验
一.任务描述 本实验任务主要对Python类与对象进行一些基本操作,通过完成本实验任务,要求学生熟练掌握Python类与对象的关系,并对Python类与对象的基本操作进行整理并填写工作任务报告. 二. ...
- Python进阶-----类、对象的相关知识
一.声明类 class 类名: #一般类名的首字母大写 '类的文档字符串' 类体 例如创建一个中国人的类: 1 class Chinese: 2 '这是一个中国人的类' #类的文档字符串 3 name ...
- python的类和对象——类的静态字段番外篇
什么是静态字段 在开始之前,先上图,解释一下什么是类的静态字段(我有的时候会叫它类的静态变量,总之说的都是它.后面大多数情况可能会简称为类变量.): 我们看上面的例子,这里的money就是静态字段,首 ...
- 【Python】Python的类和对象(长文系列第⑤篇)
系列最后一篇来说说Python中的类与对象,Python这门语言是无处不对象,如果你曾浅要了解过Python,你应该听过Python是一种面向对象编程的语言,所以你经常可能会看到面向"对象& ...
- 牛逼!Python的类和对象(长文系列第⑤篇)
系列最后一篇来说说Python中的类与对象,Python这门语言是无处不对象,如果你曾浅要了解过Python,你应该听过Python是一种面向对象编程的语言,所以你经常可能会看到面向"对象& ...
最新文章
- POJ 2828 Buy Tickets | 线段树的喵用
- py文件控制台执行时,报错:引入的模块不存在
- c语言字符为0和1,//C语言:将一个由字符0和1组成的表示二进制数的字符串,转换成相应的十进制数返回。...
- Service实现文件下载
- python里面的正则表达式
- 超级终端软件测试工程师,超级终端是否可用来测试 RS485?
- Pascal VOC 数据集国内下载
- 简述数学建模的过程_【数学建模的基本工作流程】作业帮
- ImageLoader的简单解析(六)
- python运算符手写笔记_Python笔记(四)-运算符
- 数据库MySQL详解
- Proteus仿真Arduino的Proteus Library文件下载
- 你好2019,我是全新的CPDA数据分析师课程
- JAVA网站对接验证码短信接口DEMO示例
- 成功解决raise KeyError(f“None of [{key}] are in the [{axis_name}]“)KeyError: “None of [Index([‘age.in.y
- Git vs GitHub –什么是版本控制及其工作方式?
- 零基础全天自学PHP,7个月后我找到了工作
- .NET 函数调用反转
- Pixel2Mesh-Tensorflow2
- VSCode Competitive Programming Helper (cph)插件和Code Runner的C++17设置