面向对象是一种编程思想,把数据和对数据的多个操作方法封装在一起组成类,这样通过这个类创建出来的对象,就可以直接调用这些方法了。
使用 class 关键字来创建类,类名的命名规则按照 “大驼峰命名法” (每个单词的首字母大写),定义类时有两种形式:
形式一(经典类定义形式):不写继承的父类,默认继承object
class 类名:
类成员,方法,数据属性
形式二(新式类定义形式):在类名后指定继承object这个类
class 类名(object):
类成员,方法,数据属性
示例
# 创建一个名为 MyClass 的类, x 为的属性名
class MyClass:
x = 10
可以根据已经定义的类去创建出一个或多个对象。创建对象的方式类似函数调用的方式
示例
# 使用名为 MyClass 的类来创建对象
class MyClass:
x = 10
# 创建一个名为 p 的对象
p = MyClass()
类定义不能为空,但是如果要写无内容的类定义语句,需使用 pass 语句来避免错误
示例
class Person:
pass
使用点号 . 来访问对象的属性
示例
class MyClass:
x = 10
# 创建一个名为 p 的对象,并打印 x 的值
p = MyClass()
print(p.x)
运行结果:
使用点号 . 给对象添加属性
示例
class Person:
pass
# 对象
p = Person()
# 给对象添加属性及对应的属性值
p.name = "Cindy"
p.age = 10
# 通点号 . 获取对象的属性值
print("姓名是:%s,年龄是:%d" % (p.name, p.age))
运行结果:
示例
class Person:
def __init__(self,name,age):
self.name = name
self.age = age
def info(self):
print("姓名是:%s" % self.name)
print("年龄是:%d" % self.age)
p = Person("Cindy",10)
print(p.age)
# 把 p 的年龄设置为 12
p.age = 12
print(p.age)
运行结果:
使用 del 关键字删除对象的属性(删除对象也用del关键字)
示例
class Person:
def __init__(self,name,age):
self.name = name
self.age = age
def info(self):
print("姓名是:%s" % self.name)
print("年龄是:%d" % self.age)
p = Person("Cindy",10)
# 删除 p 对象的 age 属性
del p.age
print(p.age)
运行结果:
类的方法与普通的函数有一个区别是:类的方法必须有一个额外的第一个参数名称, 按照惯例它被命名为 self 。self 代表类的实例,self 在定义类的方法时是必须有的,虽然在调用时不必传入相应的参数。self 参数是对类的当前实例的引用,代表当前对象的地址,用于访问属于该类的变量。
示例
class MyClass:
def info(self):
print(self)
m = MyClass()
# 点号 . 表示选择属性或者方法
# 对象调用实例方法info(),执行info()里面的代码
m.info()
# 打印对象,默认打印对象在内存中的地址,结果等同于info里面的 print(self)
print(m)
运行结果:
它不必按照惯例被命名为 self,我们可以取其他的名字,但它必须是类中任意函数的首个参数
示例
# 使用abc 和 xyz 代替 self
class MyClass:
def info(abc):
print(abc)
def myfunc(xyz):
print(xyz)
m = MyClass()
m.info()
m.myfunc()
print(m)
运行结果:
内置的 __ init __() 函数是一种特殊的方法,所有类都有一个名为 __ init __() 的函数,被称为类的构造函数或初始化方法,每次使用类创建新对象时都会自动调用 __ init __() 函数。如果类里面没有写 __ init __() 方法。Python会自动创建,但是不执行任何操作,如果想用来做变量初始化或赋值操作,可以自定义 __ init __() 方法
示例1
class Person:
# 在类实例化对象的时候,会被自动调用
def __init__(self):
# self代表当前类的实例对象,self.name表示将name绑定到实例上,即该类了有实例属性name。并给其赋值
self.name = "Cindy"
self.age = 10
def info(self):
# 在类的实例方法中,通过self获取该对象的属性
print("姓名是:%s" % self.name)
print("年龄是:%d" % self.age)
# 在类的方法里定义属性的固定值,则每个对象实例变量的属性值都是相同的
p1 = Person()
p1.info()
p2 = Person()
p2.info()
运行结果:
示例2
class Person:
# 在类实例化对象的时候,会被自动调用
def __init__(self,name,age):
# self代表当前类的实例对象,self.name表示将name绑定到实例上,即该类了有实例属性name,等号右边的name表示__init__()中的参数name。
# self.name = name 表示把外部传来的参数name值赋值给Person类里自己的变量name
self.name = name
self.age = age
def info(self):
# 在类的实例方法中,通过self获取该对象的属性
print("姓名是:%s" % self.name)
print("年龄是:%d" % self.age)
# 实例化对象时,参数会传递到对象的_init_()方法里
p1 = Person("Cindy",10)
p1.info()
p2 = Person("Bob",12)
p2.info()
运行结果:
补充:
在类内部获取属性和实例方法,通过self获取
在类外部获取属性和实例方法,通过对象名点号获取