一、类和实例
类是抽象的模板,而通过类可以实例出来对象。
1、创建类:
class Person(object):
pass
class 类名(继承的类的类名)
通常情况下:当一个类没有要继承的类的情况下,就继承 object类,object是所有的类都会继承的类;
2、创建类的对象并且为类的对象绑定属性
p1 = Person() #创建一个Person类的对象p1
p1.name = 'hh' #为p1绑定name属性
p1.age = 18 #为p1绑定age属性
print('p1.name:',p1.name,'p1.age:',p1.age)
3.__init__方法
在创建实例时,可以通过__init__方法将一些必须要绑定的属性强制绑定;
class Person(object):
def __init__(self,name,age):
self.name = name
self.age = age
p2 = Person('HH',18)
当使用__init__方法进行属性的绑定之后,在进行对象的创建时就要对__init__方法进行传递参数(self参数不用传,Python解释器会自己传);
注:类中的方法第一个参数必须是:self;
二、类的属性的限制访问
访问限制就是在类外不能直接通过对象对于属性进行操作,类似于C++中的private,但是在Python中,是通过对于以__开头的属性进行重命名(改变属性名,让你不知道这个属性的名字)实现的。
class Person(object):
def __init__(self,name,age):
self.__name = name
self.__age = age
def get_name(self):
return self.__name
因为Python将Person类的__name属性进行了重命名,所以通过对象.__name是访问不到的;
当我们要对于这类属性进行操作的时候可以通过定义方法进行去操作,例如:get_name方法;
三、继承和多态
当子类对于父类进行继承时,会继承父类的方法,子类也可以对于父类的方法进行覆盖:
class Plant(object):
def color(self):
print('Plant is green')
class Grass(Plant):
def color(self):
print("Grass is green")
class Tree(Plant):
pass
当子类对于父类的方法覆盖之后,在子类的对象进行调用的时候,调用的为子类的方法;
在Python中,如果一个方法的参数类型为Plant类型,那么也可以传入Grass的对象或者Tree对象,也就是说子类的对象的数据类型也可以是父类,但是子类的数据类型则不能为父类。
四、类的属性和实例的属性
类的属性归类所有的实例共享的,但是实例的属性是可以随意绑定的;
class Person(object):
group = 'person'
def __init__(self,name):
self.name = name
当实例的属性名称和类的属性名称相同时,实例的属性就会覆盖类的属性(不建议实例的属性和类的属性使用相同的名称);
五、属性和方法的绑定
在Python中,创建一个类的对象后可以为该对象绑定任何的属性和方法;
class Person(object):
pass
p1 = Person()
p1.name = 'HH' //为Person的类的对象p1绑定属性name;
def hello(self):
print('hello')
from types import MethodType
p1.hello=MethodType(hello,p1) //将hello的方法绑定到p1对象
p1.hello() //p1对象调用hello()方法
当给一个对象绑定方法之后,对于该类的其他实例是不起作用的,所以,可以通过对一个类绑定方法,让该类的所有实例都具有该方法。
def play(self):
print('playing')
Person.play = play
p2 = Person()
p2.play()
当一个类需要限制实例的属性时,可以通过__slots__变量进行操作;
由于Person类限制了属性只能是name和age这两个属性,所以sex属性绑定失败;
注:作者水平有限,如有问题,请留言,谢谢!