一、面向对象

类(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

文章信息

张雪随笔
master
Homepage
Issues
Download

This Software is under the terms of The Unlicense.