作者:exit佑 | 来源:互联网 | 2023-05-17 18:05
对象,是对事物的抽象,包含了事物的一些属性,和动作。
类示例
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) # 相当于调用类的构造函数