面向对象(上)
python一切皆对象,类也是对象,对于同一个类,类对象只有一个,但实例对象可以有多个
类对象拥有类属性和类方法,实例对象拥有实例属性和实例方法
内部访问和外部访问,所有在类定义时的访问都属于内部访问,所有在类定义后的访问都属于外部访问
1.构造方法__new__()
构造方法用于创建 <实例对象> 并返回该创建对象,该方法一般不需要重写
def __new__(cls): cls代表当前的类对象
语句体
2.初始化方法__init__()
用于初始化构造方法创建出的 <实例对象> ,当我们通过 类名(参数表) 构造实例对象时,会依次调用构造方法和初始化方法并返回由构造方法创建出的实例对象,在该方法中我们可以定义并初始化实例属性,该方法是唯一不能从父类继承的方法,必须重写
实例属性分类:
(1)公有实例属性:类外部可直接访问
定义格式: self.实例属性名
访问格式:(内部/外部) self.实例属性名
(2)私有实例属性:定义时在属性名前加两个下划线"__",类外部不可直接访问,但不是不能访问
定义格式: self.__实例属性名
访问格式: (内部) self.__实例属性名
(外部) self._类名__实例属性名
def __init__(self[,形参表]):
self.实例属性名1 = 初始值1
self.实例属性名2 = 初始值2
...
self.__实例属性名p1 = 初始值p1
self.__实例属性名p2 = 初始值p2
3.析构方法__del__()
用于销毁 <实例对象> ,回收为其分配的资源,python具有垃圾回收机制,会自动调用父类的该方法回收资源,一般无需重写该方法
def __del__(self):
语句体
4.类属性与类方法
类属性或类方法,属于类对象,与实例对象无关,不可在类方法中使用实例对象的属性和方法(因为实例对象不一定存在)
类属性:属于类对象,也分为公有和私有
定义格式:
(1)公有类属性:类属性名 = 初始值
(2)私有类属性:__类属性名 = 初始值
访问格式:
(1)公有类属性:(内部/外部) 类名.类属性名 注:类方法中访问比较特殊,参考下文
(2)私有类属性:(内部) 类名.__类属性名 注:类方法中访问比较特殊,参考下文
(外部) 类名._类名__类属性名
类方法:属于类对象,可直接通过访问其他类方法和类属性,不可访问实例属性或实例方法
访问格式:(内部) cls.类属性名/cls.类方法名()
(外部) 类名.类属性名/类名.类方法名()
定义格式:
@classmethod
def 类方法名(cls[,形参表]):
语句体
静态方法:不属于类对象,相当于定义在类内部的全局函数,不可直接访问类属性或类方法
访问格式:(内部/外部) 类名.类属性名/类名.类方法名()
定义格式:
@staticmethod
def 静态方法名([形参表]):
语句体
将方法转变为属性调用(主要用于私有属性的外部访问)
@property
def 属性名(self):
return self.__属性名
@属性名.setter
def 属性名(self,参数):
if 检查条件:
self.__属性名 = 参数
class People(object):
def __init__(self,name,age):
self.name = name
self.__age = age
@property
def age(self):
return self.__age
@age.setter
def age(self,num):
if self.__age<num<1000:
self.__age = num
p1 = People("小明",20)
print(p1.age)
p1.age = 30
print(p1.age)
实例方法:属于实例对象,不可直接访问类对象属性或方法
访问格式:类名.类属性名/类名.类方法名()
5.实例属性与实例方法
实例属性或方法,属于实例对象,与类对象无关,但可访问类属性或类方法(因为类对象定义后就已经存在)
实例方法:属于实例对象,不可直接访问类对象属性或方法
访问格式:类名.类属性名/类名.类方法名()
注:所有私有属性或方法,除非有特殊要求,一般情况不建议直接访问
代码演示
class People(object):
"""定义people类"""
c_name = "People"
__name = "__People"
def __init__(self,name,age,work,salary):
''' 类初始化方法
注:此方法必须重写,这是唯一不能从父类继承的方法
'''
self.name = name
self.work = work
self.__salary = salary
self.__age = age
def infor(self):
print(self.name)
print(self.__salary)
self.print_age()
self.__print_salary()
print(People.c_name)
print(People.__name)
People.public_infor()
People.__private_infor()
People.spublic_infor()
People.__sprivate_infor()
@classmethod
def c_acc(cls):
print(cls.c_name)
print(cls.__name)
cls.public_infor()
cls.__private_infor()
cls.spublic_infor()
cls.__sprivate_infor()
@staticmethod
def s_acc():
print(People.c_name)
print(People.__name)
People.public_infor()
People.__private_infor()
People.spublic_infor()
People.__sprivate_infor()
def print_age(self):
print(self.__age)
def __print_salary(self):
print(self.__salary)
@classmethod
def public_infor(cls):
print("classmethod 类名:{0}".format(cls.__name))
@classmethod
def __private_infor(cls):
print("classmethod 类名:{0}".format(cls.__name))
@staticmethod
def spublic_infor():
print("staticmethod 类名:{0}".format(People.__name))
@staticmethod
def __sprivate_infor():
print("staticmethod 类名:{0}".format(People.__name))
print(People.c_name)
print(People._People__name)
People.public_infor()
People._People__private_infor()
People.spublic_infor()
People._People__sprivate_infor()
i_people = People("小明",18,"programer",5000)
print(i_people.name)
print(i_people._People__salary)
i_people.print_age()
i_people._People__print_salary()