目录

一、类

二、对象

三、属性

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的类和对象相关推荐

  1. Python基础(类与对象)

    Python基础(类与对象) 一.编程的两大思想 面向过程和面向对象 面向过程 面向对象 区别 事物比较简单,可以用线性的思维去解决 事物比较复杂,使用简单的线性思维无法解决 共同点:面向对象和面向过 ...

  2. Python基础——类与对象

    Python基础--类与对象 Python基础--类与对象 类与对象 数据类型 对象 类的创建 创建语法 类的创建 对象的创建 对象调用类中的内容 类属性,类方法,静态方法 类属性 访问类属性 类方法 ...

  3. Python的类和对象的介绍,定义类和对象,定义实例方法和属性以及Python中的魔法方法

    Day09新手小白学python 第九节 Python的类和对象的介绍,定义类和对象,定义实例方法和属性以及Python中的魔法方法 目录 Day09新手小白学python 前言 一.面向对象介绍 二 ...

  4. python基础(14)之 类和对象

    目录 Python类和对象 一.创建类 二.创建对象 三.init() 函数 四.对象方法 五.自参数 六.对象及其属性更改 七.pass语句 Python类和对象 Python 类/对象.Pytho ...

  5. python的类和对象_Python类与对象实验

    一.任务描述 本实验任务主要对Python类与对象进行一些基本操作,通过完成本实验任务,要求学生熟练掌握Python类与对象的关系,并对Python类与对象的基本操作进行整理并填写工作任务报告. 二. ...

  6. Python进阶-----类、对象的相关知识

    一.声明类 class 类名: #一般类名的首字母大写 '类的文档字符串' 类体 例如创建一个中国人的类: 1 class Chinese: 2 '这是一个中国人的类' #类的文档字符串 3 name ...

  7. python的类和对象——类的静态字段番外篇

    什么是静态字段 在开始之前,先上图,解释一下什么是类的静态字段(我有的时候会叫它类的静态变量,总之说的都是它.后面大多数情况可能会简称为类变量.): 我们看上面的例子,这里的money就是静态字段,首 ...

  8. 【Python】Python的类和对象(长文系列第⑤篇)

    系列最后一篇来说说Python中的类与对象,Python这门语言是无处不对象,如果你曾浅要了解过Python,你应该听过Python是一种面向对象编程的语言,所以你经常可能会看到面向"对象& ...

  9. 牛逼!Python的类和对象(长文系列第⑤篇)

    系列最后一篇来说说Python中的类与对象,Python这门语言是无处不对象,如果你曾浅要了解过Python,你应该听过Python是一种面向对象编程的语言,所以你经常可能会看到面向"对象& ...

最新文章

  1. POJ 2828 Buy Tickets | 线段树的喵用
  2. py文件控制台执行时,报错:引入的模块不存在
  3. c语言字符为0和1,//C语言:将一个由字符0和1组成的表示二进制数的字符串,转换成相应的十进制数返回。...
  4. Service实现文件下载
  5. python里面的正则表达式
  6. 超级终端软件测试工程师,超级终端是否可用来测试 RS485?
  7. Pascal VOC 数据集国内下载
  8. 简述数学建模的过程_【数学建模的基本工作流程】作业帮
  9. ImageLoader的简单解析(六)
  10. python运算符手写笔记_Python笔记(四)-运算符
  11. 数据库MySQL详解
  12. Proteus仿真Arduino的Proteus Library文件下载
  13. 你好2019,我是全新的CPDA数据分析师课程
  14. JAVA网站对接验证码短信接口DEMO示例
  15. 成功解决raise KeyError(f“None of [{key}] are in the [{axis_name}]“)KeyError: “None of [Index([‘age.in.y
  16. Git vs GitHub –什么是版本控制及其工作方式?
  17. 零基础全天自学PHP,7个月后我找到了工作
  18. .NET 函数调用反转
  19. Pixel2Mesh-Tensorflow2
  20. VSCode Competitive Programming Helper (cph)插件和Code Runner的C++17设置

热门文章

  1. [CV]一些关于计算机视觉面试题的整理
  2. IDEMIA将与MobileIron携手合作,助力企业客户管理现代Windows设备上的eSIM连接
  3. 数据库中索引的优缺点和分类
  4. Android轻量级数据SparseArray详解
  5. Element 表单检验不通过解决思路
  6. 基于深度学习的高精度牙齿健康检测识别系统(PyTorch+Pyside6+YOLOv5模型)
  7. 2023/2/10总结
  8. 亮点抢先看!华为中国合作伙伴大会2023即将启幕
  9. Markdown 语法汇总
  10. 等保备案是等保测评吗?两者是什么关系?