在开发中经常需要自定义一些对象。
根据类来创建对象,对象是类的实例。
像int() float() bool() str() list() dict() 都是类,内置类以小写字母开头,自定义类使用大写字母开头。
语法:
class Myclass():
pass
mc=MyClass()
mc_2=MyClass() #创建了两个对象,均为一类对象,都是MyClass实例
isinstance()用来检查一个对象是否是一个类的实例。
例如 isinstance(mc, MyClass)
类也是一个对象,是一个创建对象的对象。
对象的创建流程:1、创建一个变量mc;2、在内存中创建了一个新对象;3、将对象的id赋值给变量。
可以向对象中添加变量,对象中的变量称为属性。
语法:对象.属性名 = 属性值(可为任意对象)
例:mc.name = ‘beauty’
类的定义
类和对象都是对现实生活中的事物或程序中的内容的抽象。由两部分构成:数据(属性)+行为(方法)。属性为实例的公共属性。方法即类中的函数,调用语法:对象.方法名()
属性和方法查找流程:当调用一个对象的属性时,解析器会先在当前对象中寻找是否有该属性,如果有,则返回;反之则会去当前对象的类对象中去寻找。一般情况下,属性保存到实例对象中,而方法需要保存到类对象中。
类的特殊方法init
在类中可以定义一些特殊方法,都是以__(双下划线)开头,__结尾的方法,不需要自己调用,会在特殊时刻自动调用。
例:
class Person:
def __init__(self,name):
self.name = name
def say_hello(self):
print('Hello,I am %s'%self.name)
所以p1=Person()的运行流程为:1、创建一个变量;2、在内存中创建一个新对象;3、init(self)方法执行,对象创建以后立即执行;4、将对象的id赋值给变量。
类的基本结构
class 类名([父类]):
公共属性
#对象的初始化方法:
def __init__(self,arg...):
self.arg = arg #这里的arg指各个参数等。
#其他方法
def method_1(self,...):
代码块
def method_2(self,...):
代码块
封装
面向对象的三大特性之一。能隐藏对象中一些不希望被外部所访问到的属性或方法。
getter获取对象中的指定属性(get_属性名);
setter用来设置对象的指定属性(set_属性名)。
例:
#(1)先隐藏
self.hidden_arg = arg
#(2)
def get_arg(self):
return self.hidden_arg
#(3)
def set_arg(self):
self.hidden_arg = arg
使用封装,确实增加了类的定义的复杂程度,但是它也保证了数据的安全性:(1)隐藏了属性名,使调用者无法随意的修改对象中的属性。(2)增加了getter和setter方法,很好的控制属性是否是只读的。只读:去掉setter方法;不能访问:去掉getter方法。(3)使用setter方法设置属性,可以增加数据的验证,确保数据是正确的。
隐藏类中的属性:__(双划线)开头,不能直接访问和修改。但是常用_(单下划线)开头,起个提示作用,告诉别人这是私有属性,若没有特殊需求请不要修改。
继承
例:class Dog(Animal):
Dog为子类,Animal为父类,子类可以直接继承父类中的所有属性和方法。
在创建类时,若省略了父类,则默认父类为object。
方法的重写:如果在子类中有和父类同名的方法,则通过子类实例去调用方法时,会调用子类的方法而不是父类的方法,即重写(覆盖,override)
super():可以用来获取当前类的父类,调用父类方法时,不需要传递self。