面向对象编程思想
类:把共同属性抽象出来
对象:把类实例化,设置各自的属性
类的特点
封装 继承 多态
类的定义
- 创建一个类后,可以通过类名访问其属性和方法。
- 定义了构造方法后,类的实例化操作会自动调用它。
- 可以没有构造方法,但必须有set方法初始化。
- self表示实例对象,代表类的实例,不是类。
class Person1(object):#类的定义
def __init__(self,name,sex):#__init__初始化
self.name = name
self.sex = sex
"""
def set_person(self,name,sex):#set初始化
self.name = name
self.sex =sex
"""
def get_name(self):
return self.name
def get_sex(self):
return self.sex
if __name__ =='__main__':
# 类的实例化1
person11 = Person1('ming','male')
# 类的实例化2
"""
person1 = Person1()
person1.set_person('GALA','male')
"""
print(person11.name) # 访问实例的属性
print(person11.get_name()) #通过访问类中的方法
类的变量
-
类变量
在多个实例中共享数据 -
实例变量
只作用在此实例中
class Person(object):#类的定义
total_Person =0 #类变量
def __init__(self,name,sex):#构造方法
self.name = name
self.sex = sex
self.total_Person+=1 #实例变量
Person.total_Person +=1#类变量
person1 = Person('GALA','male')#类的实例化
print(Person.total_Person) #通过类名访问类中定义的属性
print(person1.name) # 访问实例的属性
print(person1.get_name()) #通过访问类中的方法
print(person1.sex_ch())
person2 = Person('ming','male')
print(person2.total_Person)
实例的变量,与类中定义的不一样
类的方法
类中的方法
类的方法必须包含参数self,且是第一个参数。
def get_name(self):
return self.name
def sex_ch(self):
if self.sex == 'male':
return 'nan'
类方法
@classmethod类方法
- 不用通过实例化类就能访问的方法。
- @classmethod 装饰的方法不能使用实例属性,只能是类属性。
- 它主要使用在和类进行交互,但不和其实例进行交互的函数方法上。
- 类方法第一个参数要默认传类,cls
@classmethod#类方法
def set_new_name(cls,new_name):
return 'nn:'+new_name
#调用类方法
print(Stud.set_new_name('Beichuan'))#被类调用
print(per3.set_new_name('beichuan'))#被实例调用
静态方法
@staticmethod 静态方法
- @staticmethod 修饰的方法是放在类外的函数,我们为了方便将他移动到了类里面,它对类的运行无影响。
- 静态方法对参数没有要求,希望共享某些变量,不想每次实例化
@staticmethod #静态方法
def get_new_sex(new_sex):
return 'ns:'+new_sex
#调用静态方法
print(Stud.get_new_sex('fe'))#被类调用
print(per3.get_new_sex('rf'))#被实例调用
实例方法
- @property 将类方法转换为只读属性
- 实例方法只能被实例对象调用
- 实例方法,第一个参数必须默认传实例对象,self
@property#实例方法
def set_new_age(self):
return 'na'
#调用实例方法
print(per3.set_new_age)
- 静态方法和类方法都可以被类或类的实例对象调用
- 实例方法只能被实例对象调用
类的继承
类与类之间有一些公共的属性和方法,这时我就可以把相同的属性和方法作为基类的成员,而特殊的方法及属性则在本类中定义。
子类的定义
class Stud(Person):
初始化方法
初始化父类中的变量
初始化新属性
class Stud(Person):
def __init__(self,name,sex,age,ab):
#super(Stud.self).__init__(name,sex)#初始化父类的方法1
Person.__init__(self,name,sex)#初始化父类方法2
self.age = age
覆写父类的方法
- 调用方法
先调用子类中有的方法,子类没有调用父类的 - 多继承
方法从低到高找(子类,父类,爷爷类),从左往右找(class1,class2)。
class Person(object):#类的定义
total_Person =0 #类变量
def __init__(self,name,sex):#构造方法
self.name = name
self.sex = sex
self.total_Person+=1 #实例变量
Person.total_Person +=1#类变量
def get_name(self):
return self.name
def sex_ch(self):
if self.sex == 'male':
return 'nan'
class Hun(object):
def __init__(self,eat):
self.eat = eat
class Stud(Person,Hun):
def __init__(self,name,sex,age,eat,ab):
# super(Stud,self).__init__(name,sex)#初始化父类的方法1
Person.__init__(self,name,sex)#初始化父类方法2
Hun.__init__(self,eat)
self.age = age
self.__ab = ab #私有变量
def sex_ch(self):#覆写父类方法
return 'game'
per3 = Stud('Bo','male','18','a','私有变量')
print(per3.sex_ch())#调用方法
print(Stud.total_Person)#调用父类属性
私有化
- 双下划线开头命名:声明该变量/方法为私有,无法在类的外部被使用和访问
- 在内部使用self.访问。
- 外部通过“ _类名__xx ”可以访问到属性的值。
class Hun(object):
def __init__(self,ab):
self.__ab = ab#初始化私有变量
def get_ab(self):#访问私有变量
return self.__ab
if __name__ =='__main__':
p = Hun('a')
print(p.get_ab())#成功
print(p._Hun__ab)#成功
print(p.__ab)#失败
下划线相关变量命名
- 单下划线开头命名:潜规则认为最好不要修改的变量。
- 双下划线开头结尾:系统自定义名字,不建议占用。
模块
模块,在Python可理解为对应一个.py文件。在其他需要这些功能的文件中,导入import这模块,就可重用这些函数和变量。
包
- 包是一个有层次的文件目录结构,它定义了由n个模块或n个子包组成的python应用程序执行环境。
- 包是一个包含__init__.py 文件的目录,该目录下一定得有这个__init__.py文件和其它模块或子包。
- 通常包总是一个目录,可以使用import导入包,或者from + import来导入包中的部分模块。