面向对象编程-基础
类与对象
类提供了把数据和功能绑定在一起的方法。创建新类时创建了新的对象类型,从而能够创建该类型的新实例/对象。
类时抽象的概念,作为数据类型代表一类事物;对象时具体实际的,作为实例代表具体事物;类是对象的模板,对象是类的个体,对应一个实例。
对象在内存中的存在形式:
属性/成员变量
类中定义的属性(变量),也称为成员变量
属性名 = 值
如果没有值可以赋值None,None是Python的内置常量,通常被用来代表空值的对象
类的定义
class 类名:
属性/成员变量...
行为/成员方法...
对象的传递机制
class Person:
age = None
name = Name
a = Person()
a.age = 10
a.name = "jack"
b = a
print(b.name) #jack
b.age = 200
b = None # NoneType
print(a.age) # 200
print(b.age) #报错
对象的布尔值
Python一切皆对象,所有的对象都有一个布尔值,通过内置函数bool()
可获取对象的布尔值
False:False、数值0、None、空数据容器
成员方法
类中定义的行为(函数),称为成员方法/方法。
def 方法名(self, 形参列表):
方法体
- Python也支持对象动态的添加方法,注意只是针对该对象添加方法
对象.添加的方法名 = 指定方法名
class Person:
age = None
name = Name
def ok(self):
print("ok")
def hi:
print("hi")
p = Person()
p.m1 = hi
print(type(p.m1), type(hi)) #<class 'function'> <class 'function'>
print(type(p.ok)) # <class 'method'> 运行机制一样,只是名称叫法不同
self
self
表示当前对象本身,在成员方法内,访问对象的属性/成员变量self.属性/成员变量
。
- 当我们通过对象调用方法时,self会隐式传入
- 定义成员方法时,需要写上
self
,如果不写,则需要使用@staticmethod
标注,否则会报错。 @staticmethod
将方普通法转换为静态方法。静态方法不会接收隐式第一个参数。静态方法相比普通方法,处额可以通过对象调用,还可以通过类名调用。
class Dog:
name = "哈士奇"
age = 2
def info(self, name):
print(f"name信息->{name}")
@staticmethod
def ok():
print("ok")
dog = Dog()
dog.info("德牧")
dog.ok()
Dog.ok()
对象作为传参传递
作用域
成员变量/属性:类中定义的变量,作用域为整个类
局部变量:一般指成员方法中定义的变量,作用域为当前方法
属性和局部变量可以重名,访问的时候带上self代表访问属性
构造方法
需求:用类创建对象时,即指定属性
在初始化对象时,会自动执行__init__
方法,传入的参数会自动传递给__init__
方法
class Person:
name = None
age = None
def __init__(self, name, age):
print(f"__init__方法执行了 {name} {age}")
self.name = name
self.age = age
p1 = Person("kobe", 20) # __init__方法执行了 kobe 20
- 构造方法没有返回值
- Python语言中,一个类只有一个
__init__
方法,即使写了多个,也只有最后一个生效。Python中实现多个构造方法效果的办法 - Python可以动态地生成对象属性。
class Person:
# 类没定义属性
# name = None
# age = None
def __init__(self, name, age):
print(f"__init__方法执行了 {name} {age}")
# 此处动态生成属性
self.name = name
self.age = age
p1 = Person("kobe", 20) # __init__方法执行了 kobe 20