python面向对象(一)
1.定义类
下面定义了一个简单的People类:
class People:
pass
# 构建对象
people = People()
类代表了具有相同特征的一类数据的抽象,可以根据类生成相应的对象,以此来对应客观世界存在的事物。
2.在类中定义方法
类中定义的方法,代表了特定对象所具有的行为,类中定义的方法一般第一个接受的参数是self,代表了其本身,和java中的this类似。
定义__init__方法
init方法是类的初始化方法,当通过类构建了对象之后就会调用,通常用于对象构建之后的初始化或赋值。如下是对people类的完善:
class People:
def __init__(self, name, age):
self.name = name
self.age = age
p = People("小明", 20)
# p.name = "小明"
可以看到方法前后各有两个连接的下划线,在 Python中,这样的名称意味着在类以外的其他位置不要直接调用,基本上都会有个函数来调用这类方法,就init而言,如果创建 People实例时就会调用这个初始化方法。
定义__str__方法
str方法当使用print输出对象时会调用,或者使用str()方法传入对象,也会调用该方法。__str__方法获取描述字符串并返回。
class People:
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
return "我叫{name},今年{age}岁。".format(name=self.name, age=self.age)
p = People("小明", 20)
print(p)
# 输出为:我叫小明,今年20岁。
从__init__、__str __、的例子中可知,在 Python中,__xx__这类有着特定意义的方法名称还真不少,之后还会看到更多。
定义操作方法
操作方法也就是一般的方法,可以在对象中用.的形式直接调用,会有对应的返回值,这些方法是用户自己定义的对类的行为的扩充。
class People:
# 省略init
def eat(self):
print("吃饭")
p = People("小明", 20)
p.eat()
# 输出为:小明吃饭
3.定义内部属性
如上我们定义的people类中,在init方法内定义了两个属性name和age,当然因为python在定义变量不用事先声明,因此也可以在构建对象之后,再在对象上通过. 的形式增加属性,但不建议这样做,最好还是在类定义的时候定义好属性,然后在实际运用时按类中定义的属性来运用。
完成get与set
在Java语言中,定义类的时候,会将一些属性定义为私有的,避免了从外部直接访问对象中的变量(属性),这样更安全一些;相应的,在类的内部提供get和set方法,外部能够调用这两个方法来完成对属性值的获取和赋值。
Python中没有私有变量的概念,但也能通过一些特定的方法实现类似Java中的get和set功能。
- 对于类中的属性,可以在命名时在其开头增加__使其变成内部属性,外部就无法直接获取该属性了,但这并不是私有的,Python并没有完全限制从外部取属性,在属性头部加上__之后,属性名称会自动转换成__className_属性名的形式,外部是可以通过这中属性名访问的。
- 对于内部属性,可以设置其“get”方法来获取其值,具体操作就是定义一个方法,其作用就是返回内部属性的值,然后可以通过调用该方法来使用;为了让使用更方便,我们也可以在该方法上加上@property的注解,那么之后就可以使用类似属性获取的方式调用该方法了(看起来就像是类的一个属性)。
- 对于内部属性的赋值,也是通过方式实现的,定义一个“set”方法,其作用就是给内部属性赋值,外部可以直接调用该方法为内部属性赋值;同时可以使用@xx.setter注解让该方法调用更加简单(比如使用=就可以调用该方法)。
一个示例:
class People:
def __init__(self, name, age):
self.__name = name
self.__age = age
# get方法,获取内部属性
@property
def name(self):
return self.__name
# set方法,给内部属性赋值
@name.setter
def name(self, set_name):
self.__name = set_name
p = People("小明", 20)
p.name = "小华" # 通过=直接调用方法
p.name # 通过属性的样式调用get方法
注意:使用注解之后就不能再直接按照函数那样调用原方法了,同时可以看到get和set方法是重名的,python不支持方法重载?,因此有重名方法时,近的会将远的覆盖,这里使用了注解之后可以使用重名的方法,相当于给方法重新命名了。
同时可以看到,现在获取属性和给属性赋值都比较方便了。
本文地址:https://blog.csdn.net/Chengjiayi2/article/details/107314425