1. 类与实例
#类的定义
class Person(object):
"""定义一个Person类
Person类具有的属性:性别
Person类具有的功能:说话
"""
sex='female' #类属性
def __init__(self,name):
"""构造方法:在创建类实例时,初始化"""
self.name=name #实例属性
self.__age=100 #私有属性
def hello(self,language):
"""自定义方法"""
result={'name':self.name,'sex':self.sex,'language':language}
return result
def get_age(self):
return self.__age
#类的使用
#创建实例对象,传入构造方法中规定的参数
p1=Person('sandy')
print('p1: ',p1)
#调用类中的自定义方法
print(p1.hello('普通话'))
#通过类方法访问类中的私有属性
print(p1.get_age())
#调用类的属性
print('p1.sex: ',p1.sex)
#调用实例的属性
print('p1.name: ',p1.name)
运行结果是:
- 通过关键字class来声明类,class后面跟着类名,类名后面的括号里面跟着该类的父类
- 类中的方法,第一个参数固定是self,它表示实例对象本身,通过self.XXX可以调用实例对象所拥有的的属性和方法
- 通过
类名(初始化参数)
实例化一个对象,该初始化参数传给类中的构造方法__init__
2. 属性
类属性
在声明类后,就存在于内存中,能够通过类来直接访问
实例属性
只有在实例化后才存在,不能直接通过类来访问,只能通过实例对象访问
私有属性
命名时以两个下划线开头,不能直接通过实例调用,一般通过类的方法来访问
3. 方法
类中的方法第一个参数都是变量self,self表示调用此方法的实例化对象,类中的方法需要实例化后才能调用;
但静态方法和类方法可以通过类直接调用
静态方法@staticmethod
- 与类相关但又不需要改变类和实例状态的方法,这类方法可以声明为静态方法
- 静态方法不需要访问类里的任何参数,所带的参数都是从外部传入的
- 静态方法使用函数修饰符@staticmethod声明
类方法@classmethod
- 类方法使用函数修饰符@classmethod声明
- 类方法的第一个参数是表示自身类的cls参数,可以用来调用类的属性,类的方法
#类的定义
class Person(object):
"""定义一个Person类
Person类具有的属性:性别
Person类具有的功能:说话
"""
sex='female'
def __init__(self,name):
"""构造方法:在创建类实例时,初始化"""
self.name=name #实例属性
def hello(self,language):
"""自定义方法"""
result={'name':self.name,'sex':self.sex,'language':language}
return language
@staticmethod
def sing(song):
print('sing: ',song)
@classmethod
def run(cls,distance):
print('run: ',distance,'sex: '+cls.sex)
#调用方法
Person.sing("ABCDEFG") #类直接调用静态方法
Person.run('400') #类直接调用类方法
p=Person('Andy')
p.sing('HIJKLMN...') #通过实例调用静态方法
p.run('7000') #通过实例调用类方法
特殊方法
new:作用在构造方法创建实例之前
init:构造方法,作用于创建实例之时
str:作用于输出实例对象时
del:作用于销毁实例对象时
#类的定义
class Person(object):
"""定义一个Person类
"""
def __init__(self,name):
self.name=name
print('__init__ function call')
def __new__(cls, *args, **kwargs):
print('__new__ function call')
return super(Person,cls).__new__(cls)
def __str__(self):
print('__str__ function call')
return self.name
def __del__(self):
print('__del__ function call')
#调用方法
print('*'*30)
p=Person('lin')
print('*'*30)
print(p)
print('*'*30)
del p
运行结果是:
4. 继承
- 子类可以直接使用父类中定义的属性和方法
- 子类的方法如果和父类的方法重名,子类会覆盖掉父类
- 一般子类的构造方法都是先继承然后扩展,构造方法的继承格式是
super(子类,self).__init__(参数1,参数2...)
class Person(object):
"""定义父类Person"""
sex='female'
def __init__(self,name):
"""父类的构造方法"""
self.name=name
def hello(self):
print('name: '+self.name)
class Chinese(Person):
"""定义子类Chinese"""
def __init__(self,name,color):
"""子类的构造方法:"""
super(Chinese,self).__init__(name) #先继承父类的构造方法
self.color=color #扩展子类的构造方法
def hello(self):
"""复写子类中的方法"""
print('I am Chinese,my name is【{name}】,my color is【{color}】'.format(name=self.name,color=self.color))
p1=Chinese('lin','yellow') #调用子类的构造方法
print(p1.sex) #子类调用父类的成员数据
p1.hello() #子类调用父类的方法
运行结果是: