一、面向对象
类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。
数据成员:类变量或者实例变量用于处理类及其实例对象的相关的数据。
方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。
实例变量:定义在方法中的变量,只作用于当前实例的类。
继承:即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。
例如,有这样一个设计:一个Dog类型的对象派生自Animal类,这是模拟"是一个(is-a)"关系(例图,Dog是一个Animal)。
实例化:创建一个类的实例,类的具体对象。
方法:类中定义的函数。
对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法
二、创建类
1.语法:
class 类名称:
...
...
例如:
class User:
# 构造函数
def __init__(self, id, name):
self.id = id
self.name = name
#方法1
def func(self):
return self.id
2.构造函数
def __init__(self, id, name)
3.创建实例
from com.zx.user import User
user = User(1, "张三")
4.self
self代表类的实例,而非类,调用方法的时候,self忽略不管
类中定义方法:
def func(self):
return self.id
调用:
user.func();
5.访问属性
根据构造函数,间接定义的类的一部分属性,可以直接访问
print(user.id)
print(user.name)
三、继承
1.单继承
父类:
class base:
#父类的构造方法,是不会被子类集成的
def __init__(self):
print("我是爹")
#普通方法会被继承
def toString(self):
return "23333"
子类:
from com.zx.base import base
class User(base):
# 构造函数
def __init__(self, id, name):
self.id = id
self.name = name
#方法1
def func(self):
return self.id
2.多继承
class DerivedClassName(Base1, Base2, Base3):
需要注意圆括号中父类的顺序,若是父类中有相同的方法名,而在子类使用时未指定,
python从左至右搜索 即方法在子类中未找到时,从左到右查找父类中是否包含方法,调用第一个符合的父类方法。
四、方法重写
如果你的父类方法的功能不能满足你的需求,你可以在子类重写你父类的方法,实例如下:
如父类中的方法:
def toString(self):
return "23333"
子类中重写方法:
def toString(self):
return "子类方法"
五、类属性与方法
1.私有属性
__私有属性名称:两个下划线开头,声明该属性为私有,不能在类地外部被使用或直接访问。在类内部的方法中使用时 self.__私有属性名称。
2.方法
在类地内部,使用def关键字可以为类定义一个方法,与一般函数定义不同,类方法必须包含参数self,且为第一个参数。在调用的使用时忽略的。
3.私有方法
__私有方法名称:两个下划线开头,声明该方法为私有方法,不能在类地外部调用。在类的内部调用 self.__私有方法名称。
4.类的专有方法:
****__init__ : 构造函数,在生成对象时调用
__del__ : 析构函数,释放对象时使用
__repr__ : 打印,转换
****__str__: 转字符串
****__slots__: 对class绑定属性
class Student(object):
__slots__ = ('name', 'age') # 用tuple定义允许绑定的属性名称
__setitem__ : 按照索引赋值 ,比如:student[0] = 111
__getitem__: 按照索引获取值 ,比如:student[0]
__len__: 获得长度
__cmp__: 比较运算
__call__: 函数调用
__add__: 加运算
__sub__: 减运算
__mul__: 乘运算
__div__: 除运算
__mod__: 求余运算
__pow__: 称
__iter__: 如果一个类想被用于for ... in循环,类似list或tuple那样,就必须实现一个__iter__()方法
__next__: 与__iter__()配合使用,用来实现获得下一个元素
六、类方法和静态方法****
1.类方法,如下country就是类属性,对象属性一般定义在构造函数中。
类方法使用cls代表class,访问类属性。类属性是这个类公共的。
使用注解@classmethod修饰
class User(object):
# User的类属性
country = "2333";
# 构造函数
def __init__(self, id, name):
self.id = id
self.name = name
# 类方法
@classmethod
def getCountry(cls):
return cls.country;
@classmethod
def setCountry(cls, country):
cls.country = country;
2.静态方法,同类方法一样可以直接操作类属性。
使用 @staticmethod修饰,只能通过调用类名使用类属性。
class User(object):
# User的类属性
country = "2333";
# 实例方法
def __init__(self, id, name):
self.id = id
self.name = name
# 静态方法
@staticmethod
def get():
return User.country;
七、类的属性绑定
1.使用__slots__属性
class Student(object):
__slots__ = ('name', 'age') # 用tuple定义允许绑定的属性名称
s = Student() # 创建新的实例
s.name = 'Michael' # 绑定属性'name'
s.age = 25 # 绑定属性'age'
s.score = 99 # 绑定属性'score',这个属性就会抛出异常
2.使用@property
class Student(object):
@property#将birth设置为类属性(开放读的权限)
def birth(self):
return self._birth
@property#将age设置为类属性(开放读的权限)
def age(self):
return 2015 - self._birth
@birth.setter #birth开放写的权限
def birth(self, value):
self._birth = value
s = Student() # 实例化
s.birth = '2017-01-01'# 写
print(s.birth)# 读
try:
s.age = 10
print(s.age)
except:
print("age没有的权限")
八、枚举 Enum
from enum import Enum
Month = Enum('Month', ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'))
for name, member in Month.__members__.items():
print(name, '=>', member, ',', member.value)
更好的方法是为这样的枚举类型定义一个class类型,然后,每个常量都是class的一个唯一实例。Python提供了Enum类来实现这个功能: value属性则是自动赋给成员的int常量,默认从1开始计数。 如果需要更精确地控制枚举类型,可以从Enum派生出自定义类,@unique装饰器可以帮助我们检查保证没有重复值。
from enum import Enum, unique
@unique
class Weekday(Enum):
Sun = 0 # Sun的value被设定为0
Mon = 1
Tue = 2
Wed = 3
Thu = 4
Fri = 5
Sat = 6
print(Weekday.Mon) # Weekday.Mon
print(Weekday.Mon.value)# 1
文章信息
- 本文作者:zhangxue
- 本文链接:https://lucksnow1989.github.io/article/13.脚本语言/python/基本语法/10面向对象.html
- 版权声明:本文为本人原创文章,遵循 CC 4.0 BY-NC-SA版权协议,转载请附上原文出处链接和本声明。