Python3 入门专栏
http://blog.csdn.net/column/details/19679.html
Python 对象
- python 支持面向对象编程,支持类、成员变量、成员方法、实例变量、实例化、继承这些概念;
- python 的对象只支持类继承,并没有 Java 实现接口这种概念;
- python 的继承机制:类允许多重继承,派生类可以覆盖基类中的任何方法,方法中可以调用基类中的同名方法;
类定义和实例化
- python 使用 class 关键字 定义一个类,并没有类访问权限关键字,一个类的在该类定义的模块中可以直接访问,在不同模块中只要引入该类定义的模块即可;
- python class 中的变量和方法默认在全局范围内可以调用,如果要标记为私有变量和私有方法,只需要在变量或方法的命名前加__ 即可,如 __privateAttrName, __privateMethodName()
- 在 python class 中的方法签名和普通的函数一样,不过在参数列表中,第一个参数必须是self;
- 在 python class 中,使用self 关键子来代表类的实例对象,类似于 Java 的 this 关键字,不同的是,python class 中没有静态变量这种概念;
以下是一个示例:
import hashlib
class User:
# 类成员变量(公开)
name = ""
age = 0
city = ""
# 类成员变量(私有)
__password = ""
# 构造函数
def __init__(self, name, age, city):
self.name = name
self.age = age
self.city = city
# 类成员方法(公开)
def set_passoword(self, passoword):
self.__password = self.__encode_md5(passoword)
def get_password(self):
return self.__password
# 类成员方法(私有)
def __encode_md5(self,password):
hash = hashlib.md5()
hash.update(password.encode("utf-8"))
return hash.hexdigest()
# 打印方法,同 __repr__(),类似于 Java Object 的 toString() 方法
def __str__(self):
return "user:[name=%s ,age=%d, city=%s]" % (self.name, self.age, self.city)
# 实例化对象
user = User("assad", 20, "Guangzhou")
print(user) # 输出: user:[name=assad ,age=20, city=Guangzhou]
# 访问类成员变量
print(user.name) # 输出: assad
print(user.age) # 输出: 20
# 调用类成员方法
user.set_passoword("2333")
print(user.get_password()) #输出:f7e0b956540676a129760a3eae309294
类的专有方法包括以下:
__init__: 构造函数,在生成对象时调用
__del__: 析构函数,释放对象时使用
__repr__ : 打印,转换
__str__: 同上
__setitem__ : 按照索引赋值
__getitem__: 按照索引获取值
__len__: 获得长度
__cmp__: 比较运算
__call__: 函数调用
__add__: 加运算
__sub__: 减运算
__mul__: 乘运算
__div__: 除运算
__mod__: 求余运算
__pow__: 乘方
运算符重载
python 支持运算符重载,通过重写类的以下专有方法即可实现对于类 +,-,* ,/,%,** 运算符的重载;
__add__: 加运算
__sub__: 减运算
__mul__: 乘运算
__div__: 除运算
__mod__: 求余运算
__pow__: 乘方
类继承
python 对于类继承的语法如下,支持多重继承;
class ChildClass(ParentClass): # 单继承,子类 CildClass 继承基类 ParentClass
class ChildClass(PraentClass1,ParentClass2) # 多继承,子类 CildClass 继承基类 ParentClass1,ParentClass2
子类完全继承父类的成员变量/成员方法(包括私有变量/方法),在子类中可以通过
super()
方法访问父类的成员变量/成员方法,在多继承中通过继承父类参数访问父类方法;
单继承示例
# 父类
class Animal:
def __init__(self):
print("animal init")
def sound(self):
print("animal:biubiubiu")
# 子类
class Cat(Animal):
def __init__(self):
super().__init__() # 调用父类方法
print("car init")
def sound(self): # 父类方法方法覆盖
print("Cat:miaomiaomiao")
# 子类
class Dog(Animal):
def __init__(self):
print("dog init")
def eat(self): # 子类新增方法
print("Dog eat bone")
cat = Cat()
cat.sound()
# 输出:
# animal init
# car init
# Cat:miaomiaomiao
dog = Dog()
dog.sound()
dog.eat()
# 输出:
# dog init
# animal:biubiubiu
# Dog eat bone
多继承示例
class Lover:
def say(self):
print("第一次有了喜欢的人")
class Friend:
def say(self):
print("有了能做一辈子朋友的人")
class Sprite(Lover,Friend):
def say(self):
Lover.say(self)
Friend.say(self)
print("两件快乐事情重合在一起。而这两份快乐,又给我带来更多的快乐。得到的,本该是像梦境一般幸福的时间……但是,为什么,会变成这样呢…… ")
sprite = Sprite()
sprite.say()
# 输出:
# 第一次有了喜欢的人
# 有了能做一辈子朋友的人
# 两件快乐事情重合在一起。而这两份快乐,又给我带来更多的快乐。得到的,本该是像梦境一般幸福的时间……但是,为什么,会变成这样呢……
# 所以白学家往死里打就对了