- 类的简介
(类相当于一张图纸)
类也是一个对象
类就是一个用来创建对象的对象
类是type类型的对象,定义类实际上就是定义了一个type类型的对象
(类中查找规则,会先从对象本身查找,如果对象中没有,会向类中查找)
(创建一个类)
class first_class:
pass
#语法: class 类名:
# 代码块
(创建一个对象)
class first_class:
pass
a = first_class()
可以向对象中添加变量,对象中的变量称为:属性
语法 对象.属性名 = 属性值
class first_class:
name = "xiaoming"
a = first_class()
a.name = "xiaozhang"
此时a对象中会有一个name属性,但并没有修改类中name的属性
对象中的函数称为:方法
调用方法 对象.方法名()
class first_class:
def function_one(self):
print("first function")
a = first_class()
a.function_one()
此时屏幕上显示:first function
- self参数
(在方法调用时,会默认传递调用此方法的对象,所以必须有一个想对应的形参对其进行接收)
class first_class:
def function_one(self):
print("first function")
a = first_class()
a.function_one()
当a调用function_one()时,会默认将a对象作为实参传给function_one
实际上所有的事物都是由两部分组成
1.数据(属性)
2.行为(方法)
- isinstance函数
语法: isinstance(对象,类)
作用:判断一个对象是否属于指定的类
class first_class:
pass
a = first_class()
result = isinstance(a,first_class)
result值为:Ture
因为a对象是又first_class类创建的
- 特殊方法
特殊方法在特殊时候自动调用,起特殊作用
__ init __ 方法
(在创建对象时调用,用于初始化对象属性)
class first_class:
def __init__(self,name):
self.name = name
a = first_class("xiaoming")
创建对象时 必须输入必要参数 否则无法创建对象
- 封装 (面向对象三大特征之一)
通过 对象.属性 的方式修改属性值,会使数据非常不安全
(通过封装可以增加数据安全性)(防君子不防小人)
方法一:
定义 getter 和 setter方法 对属性值进行修改
在修改的同时可以进行其他操作
可以使属性值不能任意修改,且修改不能为任意值
class first_class:
def __init__ (self,name,age):
self.name = name
def setter_name (self,name):
if isinstance(name,str):
self.name = name
print("修改成功")
else :
print("修改失败,修改值的类型错误")
a = first_class("xiaoming",18)
此时name的值 只能为字符串, 且只能修改name值
方法二:
可以对对象的属性使用双__下划线开头 对其进行隐藏
双下划线的属性是对象的隐藏属性,隐藏属性只能在类的内部访问,无法通过对象访问
class first_class:
def __init__(self,name):
self.__name = name
此时__name属性无法通过外部访问(理论上)
(实际上) __name 被python改成了另一种形式 _first_class__name
所有私有属性 __属性名 都被python改成了另一种形式 _类名__属性名
class first_class:
def __init__(self,name):
self.__name = name
a = first_class("xiaoming")
a._first_class__name = "xiaozhang"
此时a对象中__name的值被修改为:xiaozhang
方法三:
_属性名 的方式提醒用户此方法为私有方法,不能随意更改
- property装饰器
作用:将类中的函数变成只读属性调用
可结合getter,setter,del等方法一起使用
(这一块我也没太搞懂…)
class first_class:
def __init__(self,name):
self._name = name
@property
def name(self):
return self._name
@name.setter
def name(self,name):
self._name = name
a = first_class("xiaoming")
a.name = "xiaozhang"
print(a.name)
这样使用使a.name作为getter方法使用
a.name = xxx 作为setter方法使用
调用方法和属性一样 使其方便快捷
- 继承(面向对象三大特征之一)
作用:提高代码复用性,避免代码的重复性
语法: class 类名(父类):
(所有类的父类都为object类)
class Person():
name = "xiaoming"
def eat(self):
print("吃")
def drink(self):
print("喝")
def play(self):
print("玩")
class police(Person):
def arrest(self):
print("抓小偷")
a = police()
a.eat()
a.drink()
a.name
此时a对象不仅能调用police类里的方法 也可以调用Person类的方法,属性
(子类将继承父类中方法和属性)
方法重写:
当子类中的方法或属性与父类中的方法或属性名称相同时
子类中的方法或属性会覆盖父类的方法或属性
class first_class():
name = "xiaoming"
def __init__(self):
print("hello world",end="")
class second_class(first_class):
name = "xiaozhang"
def __init__(self):
print("hello python",end="")
a = second_class()
print(a.name)
屏幕中显示:hello pythonxiaozhang
(方法和属性调用时 会先从当前类寻找,如果没有找到会从当前类的父类中寻找,直到找到为止,如果都没有,则报错)
多重继承:
(一个类中继承多个父类,会使子类同时拥有多个父类,并且会获取到所有父类的方法,如果继承多个父类,其寻找的方法,会从第一个父类寻找,再寻找第二个,以此类推)
class A():
def test(self):
print("hello world")
class B():
def test(self):
print("hello python")
class C(A,B):
pass
a = C()
a.test()
此时屏幕输出:hello world
super()函数
(子类会继承父类中的方法,包括特殊方法,此时如果想在父类的特殊方法上添加功,不重复代码,而又不违背ocp原则,此时可以用到super()函数)
当不用super()函数时:
class A():
def __init__(self,name):
self._name = name
def test(self):
print("hello python")
class B(A):
def __init__(self,name,age):
A.__init__(self,name)
self._age = age
此方法虽然在父类的__init__方法上添加了功能,但是程序相对不太灵活
如果父类改变,程序中的代码需要改写
此时则需要用到super()函数来代替父类
class A():
def __init__(self,name):
self._name = name
def test(self):
print("hello python")
class B(A):
def __init__(self,name,age):
super().__init__(name)
self._age = age
此时不仅使程序变得灵活,且省去了self传参
- 属性和方法
实例属性 是通过实例对象添加的属性
实例属性只能通过实例对象来访问和修改,类对象无法访问和修改
class A():
def __init__(self,name):
self._name = name
a = A("xiaoming")
a.name = "xiaozhang"
类属性 直接在类中定义的属性
类属性只能通过类对象类修改,无法通过实例对象来修改
class A():
name = "xiaoming"
A.name = "xiaozhang"
实例方法
(在类中常规定义的方法都为实例方法)
实例方法 实例对象可以直接调用
类方法调用方式:类名.方法名(实例对象)
class A():
def test(self):
print("hello python")
a = A()
a.test()
A.test(a)
类方法
实例对象和类 都可以直接调用
创建类方法 需要在方法前添加 @classmethod
class A():
@classmethod
def test(cls):
print("hello python")
a = A()
a.test()
A.test()
调用类方法时 会自动传入一个实参 类