对象,是对事物的抽象,包含了事物的一些属性,和动作。
类示例
class Person(object): # 定义基本属性, 外部可访问 name = '' # 定义保护属性,只有类本身和子类可以访问 _sex = 'male' # 定义私有属性,只有类本身可以访问 __weight = 0 # __init__是一个特殊方法用于在创建对象时进行初始化操作 # 通过这个方法我们可以为学生对象绑定name和age两个属性 def __init__(self, name, age): self.name = name self.age = age # 方法之间要空出一行(编码规范) def speak(self, message): print("%s 说: %d。" % (self.name, message)) # 方法名用全小写多个单词用下划线连接(编码规范) def watch_av(self): if self.age < 18: print('%s只能观看《熊出没》.' % self.name) else: print('%s正在观看动作片.' % self.name) # 和上面代码有缩进差别,要空出两行(编码规范) def main(): # 创建Person对象并指定姓名和年龄 p1 = Person('骆昊', 38) # 调用对象方法speak, 并传入参数 p1.speak('我要学Python') # 调用对象方法 watch_av p1.watch_av()
继承
class Student(Person): grade = '' # 子类的构造函数 def __init__(self, n, a, g): # 调用父类的构造函数 Person.__init__(self, n, a) self.grade = g # 覆写父类的方法 def speak(self, message): print("%s 说: %d ,我已经在读 %d 年级" % (self.name, message, self.grade)) def main2(): # 创建学生对象并指定姓名和年龄 stu1 = Student('王峰', 18) # 调用对象方法speak, 并传入参数, 因为复写了父类方法,所以以子类格式输出 stu1.speak('我要学Python')
@property装饰器
@property包装器来包装getter和setter方法,使得对属性的访问既安全又方便.
把一个getter方法变成属性,只需要加上@property。 此时,
@property
本身又创建了另一个装饰器@age.setter
,负责把一个setter方法变成属性赋值,于是,我们就拥有一个可控的属性操作:
class Person(object): def __init__(self, name, age): self._name = name self._age = age # 访问器 - getter方法 @property def name(self): return self._name # 访问器 - getter方法 @property def age(self): return self._age # 修改器 - setter方法 @age.setter def age(self, age): self._age = age def play(self): if self._age <= 16: print('%s正在玩飞行棋.' % self._name) else: print('%s正在玩斗地主.' % self._name) def main(): person = Person('王大锤', 12) person.play() person.age = 22
__slots__
class Cat(object): pass def test(): cat = Cat() cat.name = "小黑" print(cat.name) # python 是动态语言,所以类Cat 没有任何属性, 当赋值后也会新创建一个属性 test()
为了限制类只能使用自己想要得几个属性,可以使用__slots__
class Cat(object): __slots__ = ('name', 'age')
类Cat 只能使用属性,name, age
静态函数
使用 @staticmethod 标记方法,使用时不需要实例化。
class Triangle(object): def __init__(self, a, b, c): self._a = a self._b = b self._c = c # 静态方法 @staticmethod def is_valid(a, b, c): return a + b > c and b + c > a and c + a > b if __name__ == '__main__': Triangle.is_valid((3,4,5))
类函数
使用 @classmethod标记方法
class Clock(object): """数字时钟""" def __init__(self, hour=0, minute=0, second=0): self._hour = hour self._minute = minute self._second = second @classmethod def now(cls): # cls 表示当前类 ctime = localtime(time()) return cls(ctime.tm_hour, ctime.tm_min, ctime.tm_sec) # 相当于调用类的构造函数