龙空技术网

上岸第一剑,python编程语法必修

天天不吃饭阿 55

前言:

此时兄弟们对“python父类子类属性的get和set方法”大概比较关心,你们都需要分析一些“python父类子类属性的get和set方法”的相关内容。那么小编也在网摘上网罗了一些对于“python父类子类属性的get和set方法””的相关资讯,希望各位老铁们能喜欢,同学们快快来学习一下吧!

随着互联网的高速发展,python市场越来越大,也越来越受欢迎,主要源于它:易学易用,通用性广,时代需要,源代码的开放以及人工智能浪潮,接来下我们就从这几个方向谈谈为何python越来越受欢迎,以及入门学习python编程语法

Python之所以越来越受欢迎,市场也越来越大,主要体现在以下几个方面:

易学易用:Python语言设计简洁,易于阅读和学习,学习曲线较平缓。同时具有丰富的核心函数库和第三方库,可快速构建复杂应用。通用性:Python是一种通用性编程语言,可应用于多个领域,如Web开发、数据科学、人工智能、机器学习、图像处理等。特别是数据科学和机器学习领域的发展,使Python成为一种非常流行的编程语言。开放源代码:Python是开放源代码的,具有广泛的社区支持,可以免费获取,可以免费地编写和分发应用程序。大数据时代需要:Python具有强大的数据处理和分析能力,成为数据驱动的业务和决策的输入工具之一。此外,Python还具有分布式计算、大规模数据处理和可扩展性等方面的特性,因此在大数据时代得到了广泛应用。人工智能浪潮:在深度学习和神经网络等方面,Python成为了一种基本语言。在人工智能领域,Python的扩展库TensorFlow,Jupyter Notebook等,让科学家们更方便的进行算法的实验和模拟。

因此,Python已经成为企业、政府和大学中非常重要的编程语言,并且Python在全球范围内已经得到了广泛的认可和应用,未来的发展前景也非常广阔。

那么,如何才能入门python呢,今天带来的介绍就是入门python第一步:编程语法必须

一丶python3基础入门

Python是一种高级编程语言,易于学习和使用。Python3是Python语言的最新版本,它具有许多新的特性和改进。本教程将介绍Python3的基础知识,包括变量、数据类型、运算符、条件语句、循环语句、函数、模块等。通过学习本教程,您将能够掌握Python3的基本语法和编程技巧,为进一步学习Python编程打下坚实的基础。

1.数据类型

Python3中常见的数据类型有:

整型(int):表示整数,如1、2、3等。浮点型(float):表示带小数点的数,如1.0、2.5、3.14等。布尔型(bool):表示True或False两个值。字符串型(str):表示一串字符,如"hello"、"world"等。列表型(list):表示一组有序的元素,如[1, 2, 3]、["hello", "world"]等。元组型(tuple):表示一组有序的元素,但是不可修改,如(1, 2, 3)、("hello", "world")等。字典型(dict):表示一组键值对,如{"name": "Tom", "age": 18}等。

2.变量与关键字

在Python3中,变量是用来存储数据的,可以通过赋值语句来创建变量。关键字是Python3中已经定义好的一些特殊单词,不能用作变量名。

Python3中常见的关键字有:

and、or、not:逻辑运算符。if、else、elif:条件语句。for、while:循环语句。break、continue、pass:循环控制语句。def、return:函数定义和返回值。class、object:面向对象编程。

3.语句

Python3中常见的语句有:

赋值语句:用来创建变量并赋值,如a = 1。条件语句:用来根据条件执行不同的代码块,如if、else、elif。循环语句:用来重复执行一段代码块,如for、while。函数定义语句:用来定义函数,如def。导入模块语句:用来导入其他模块中的函数或变量,如import。

4.表达式

Python3中的表达式是由变量、常量和运算符组成的式子,可以用来计算结果。常见的运算符有:

算术运算符:+、-、*、/、%、**、//。比较运算符:==、!=、>、<、>=、<=。逻辑运算符:and、or、not。

5.运算符

Python3中的运算符有很多种,包括算术运算符、比较运算符、逻辑运算符、位运算符等。**Python3中的运算符和操作对象包括**:

算术运算符:用于执行基本的数学运算,如加、减、乘、除、取模、幂等。例如:+、-、*、/、%、**。比较运算符:用于比较两个值的大小关系,返回True或False。例如:==、!=、>、<、>=、<=。赋值运算符:用于给变量赋值。例如:=、+=、-=、*=、/=、%=、**=。逻辑运算符:用于组合多个条件,返回True或False。例如:and、or、not。位运算符:用于对二进制数进行操作。例如:&、|、^、~、<<、>>。成员运算符:用于判断一个值是否在序列中。例如:in、not in。身份运算符:用于比较两个对象的内存地址是否相同。例如:is、is not。运算符优先级:用于确定运算符的执行顺序。

操作对象包括:

数字:整数、浮点数、复数等。字符串:由一系列字符组成的序列。列表:由一系列元素组成的序列,可以包含不同类型的元素。元组:与列表类似,但是元素不可修改。字典:由一系列键值对组成的无序集合。集合:由一系列元素组成的无序集合,元素不可重复。

6.字符串

Python3中的字符串是由一串字符组成的,可以用单引号或双引号来表示。字符串可以进行拼接、切片、替换等操作。

7.注释

Python3中的注释用#来表示,可以在代码中添加注释来解释代码的作用。注释可以单独一行,也可以在代码行后面添加。注释不会被解释器执行。

二丶列表与元组

在Python中,列表和元组都是用来存储一组有序数据的容器,它们的区别在于列表是可变的,而元组是不可变的。

列表

列表是Python中最常用的数据类型之一,它可以存储任意类型的数据,包括数字、字符串、布尔值、列表、元组、字典等。列表用方括号 [] 来表示,其中的元素用逗号分隔开。

创建列表

可以通过以下方式创建一个列表:

# 创建一个空列表my_list = []# 创建一个包含元素的列表my_list = [1, 2, 3, 'hello', True, [4, 5, 6]]

访问列表元素

可以通过下标来访问列表中的元素,下标从0开始,可以是负数,表示从后往前数。

my_list = [1, 2, 3, 'hello', True, [4, 5, 6]]print(my_list[0]) # 输出 1print(my_list[3]) # 输出 'hello'print(my_list[-1]) # 输出 [4, 5, 6]print(my_list[-1][0]) # 输出 4

修改列表元素

列表是可变的,可以通过下标来修改列表中的元素。

my_list = [1, 2, 3, 'hello', True, [4, 5, 6]]my_list[0] = 100my_list[-1][0] = 400print(my_list) # 输出 [100, 2, 3, 'hello', True, [400, 5, 6]]

列表操作

列表支持一些常用的操作,如添加元素、删除元素、切片等。

添加元素

可以使用 `append()` 方法向列表末尾添加一个元素,使用 `insert()` 方法在指定位置插入一个元素。

my_list = [1, 2, 3]my_list.append(4)print(my_list) # 输出 [1, 2, 3, 4]my_list.insert(1, 5)print(my_list) # 输出 [1, 5, 2, 3, 4]

删除元素

可以使用 `remove()` 方法删除指定元素,使用 `pop()` 方法删除指定位置的元素。

my_list = [1, 2, 3, 4]my_list.remove(3)print(my_list) # 输出 [1, 2, 4]my_list.pop(1)print(my_list) # 输出 [1, 4]
切片

可以使用切片来获取列表的子集,语法为 `[start:end:step]`,其中 start 表示起始位置(默认为0),end 表示结束位置(默认为列表长度),step 表示步长(默认为1)。

my_list = [1, 2, 3, 4, 5]print(my_list[1:3]) # 输出 [2, 3]print(my_list[:3]) # 输出 [1, 2, 3]print(my_list[::2]) # 输出 [1, 3, 5]

元组

元组和列表类似,也是用来存储一组有序数据的容器,但是元组是不可变的,一旦创建就不能修改。元组用圆括号 () 来表示,其中的元素用逗号分隔开。

创建元组

可以通过以下方式创建一个元组:

# 创建一个空元组my_tuple = ()# 创建一个包含元素的元组my_tuple = (1, 2, 3, 'hello', True, [4, 5, 6])

访问元组元素

可以通过下标来访问元组中的元素,下标从0开始,可以是负数,表示从后往前数。

my_tuple = (1, 2, 3, 'hello', True, [4, 5, 6])print(my_tuple[0]) # 输出 1print(my_tuple[3]) # 输出 'hello'print(my_tuple[-1]) # 输出 [4, 5, 6]print(my_tuple[-1][0]) # 输出 4

元组操作

元组是不可变的,不能修改元素,但是可以进行一些常用的操作,如切片、拼接等。

切片

可以使用切片来获取元组的子集,语法和列表相同。

my_tuple = (1, 2, 3, 4, 5)print(my_tuple[1:3]) # 输出 (2, 3)print(my_tuple[:3]) # 输出 (1, 2, 3)print(my_tuple[::2]) # 输出 (1, 3, 5)

拼接

可以使用 + 运算符来拼接两个元组。

my_tuple1 = (1, 2, 3)my_tuple2 = ('hello', 'world')my_tuple3 = my_tuple1 + my_tuple2print(my_tuple3) # 输出 (1, 2, 3, 'hello', 'world')

列表和元组的选择

列表和元组都是用来存储一组有序数据的容器,它们的区别在于列表是可变的,而元组是不可变的。因此,如果需要对数据进行增删改操作,应该使用列表;如果数据不需要修改,应该使用元组,因为元组比列表更加轻量级,占用的内存更少。

三丶字符串

Python中的字符串是一种不可变的序列类型,可以使用单引号、双引号或三引号来表示。以下是一些常见的字符串操作:

1.字符串拼接

可以使用加号(+)来拼接两个字符串,也可以使用乘号(*)来重复一个字符串。

str1 = "Hello"str2 = "World"str3 = str1 + " " + str2 # 拼接字符串print(str3) # 输出:Hello Worldstr4 = str1 * 3 # 重复字符串print(str4) # 输出:HelloHelloHello

2.字符串索引和切片

可以使用索引来访问字符串中的单个字符,索引从0开始。也可以使用切片来访问字符串中的一部分,切片的语法为`[start:end:step]`,其中start表示起始位置(包含),end表示结束位置(不包含),step表示步长(默认为1)。

str = "Hello World"print(str[0]) # 输出:Hprint(str[-1]) # 输出:dprint(str[0:5]) # 输出:Helloprint(str[6:]) # 输出:Worldprint(str[::2]) # 输出:HloWrd

3.字符串常用方法

Python中的字符串还有许多常用方法,例如:

len():返回字符串的长度。upper():将字符串中的所有字母转换为大写。lower():将字符串中的所有字母转换为小写。strip():去除字符串两端的空格。split():将字符串按照指定的分隔符分割成多个子字符串,并返回一个列表。

str = " Hello World "print(len(str)) # 输出:13print(str.upper()) # 输出: HELLO WORLDprint(str.lower()) # 输出: hello worldprint(str.strip()) # 输出:Hello Worldprint(str.split()) # 输出:['Hello', 'World']

总之,字符串是Python中非常重要的数据类型之一,掌握字符串的基本操作和常用方法对于编写Python程序非常有帮助。

四丶字典

在Python中,字典是一种无序的数据结构,用于存储键值对。字典中的键必须是唯一的,而值可以是任何类型的对象。字典用花括号{}表示,每个键值对之间用逗号分隔。

创建字典的方法:

直接使用花括号{}创建空字典

my_dict = {}
使用键值对创建字典
my_dict = {'name': 'Tom', 'age': 18, 'gender': 'male'}
使用dict()函数创建字典
my_dict = dict(name='Tom', age=18, gender='male')

访问字典中的值:

可以使用键来访问字典中的值,如果键不存在,则会抛出KeyError异常。

my_dict = {'name': 'Tom', 'age': 18, 'gender': 'male'}print(my_dict['name']) # 输出Tom

添加或修改字典中的键值对:

可以使用赋值语句来添加或修改字典中的键值对。

my_dict = {'name': 'Tom', 'age': 18, 'gender': 'male'}my_dict['name'] = 'Jerry' # 修改name的值my_dict['height'] = 180 # 添加新的键值对print(my_dict) # 输出{'name': 'Jerry', 'age': 18, 'gender': 'male', 'height': 180}

删除字典中的键值对:

可以使用`del`语句来删除字典中的键值对。

my_dict = {'name': 'Tom', 'age': 18, 'gender': 'male'}del my_dict['age'] # 删除age键值对print(my_dict) # 输出{'name': 'Tom', 'gender': 'male'}

遍历字典:

可以使用`for`循环遍历字典中的键值对。

my_dict = {'name': 'Tom', 'age': 18, 'gender': 'male'}for key, value in my_dict.items():      print(key, value)

输出:

name Tomage 18gender male

其他常用方法:

keys():返回字典中所有的键。values():返回字典中所有的值。items():返回字典中所有的键值对。五丶条件丶循环和其他语句

条件语句:

Python中的条件语句包括if、elif和else。它们用于根据条件执行不同的代码块。

if语句的语法如下:

if condition:    # code block

如果条件为True,则执行代码块。如果条件为False,则跳过代码块。

elif语句用于在if语句中添加多个条件。它的语法如下:

if condition1:    # code blockelif condition2:    # code block

如果条件1为True,则执行第一个代码块。如果条件1为False且条件2为True,则执行第二个代码块。如果条件1和条件2都为False,则跳过代码块。

else语句用于在if语句中添加一个默认情况。它的语法如下:

if condition1:    # code blockelif condition2:    # code blockelse:    # code block

如果条件1为True,则执行第一个代码块。如果条件1为False且条件2为True,则执行第二个代码块。如果条件1和条件2都为False,则执行else代码块。

循环语句:

Python中的循环语句包括for和while。它们用于重复执行代码块。

for循环用于遍历序列(如列表、元组、字符串等)。它的语法如下:

for variable in sequence:     # code block

在每次循环中,变量将被设置为序列中的下一个值,并执行代码块。当序列中的所有值都被遍历后,循环结束。

while循环用于在条件为True时重复执行代码块。它的语法如下:

while condition:      # code block

在每次循环中,检查条件是否为True。如果是,则执行代码块。如果不是,则跳出循环。

其他语句:

Python中还有一些其他语句,如break、continue和pass。

break语句用于跳出循环。它的语法如下:

while condition:      # code block      if some_condition:         break

在循环中,如果满足某个条件,则使用break语句跳出循环。

continue语句用于跳过当前循环中的剩余代码,并开始下一次循环。它的语法如下:

while condition:      # code block      if some_condition:          continue      # remaining code in loop

在循环中,如果满足某个条件,则使用continue语句跳过当前循环中的剩余代码,并开始下一次循环。

pass语句用于在代码块中占位。它的语法如下:

if some_condition:     passelse:     # code block

在代码块中,如果需要占位,则使用`pass`语句。它不执行任何操作,只是占据一个位置。

六丶函数

在Python中,函数是一段可重用的代码块,用于执行特定的任务。函数可以接受参数并返回值。函数的定义以关键字def开头,后跟函数名和括号,括号中可以包含参数列表。函数体包含在冒号后面的缩进块中。

以下是一个简单的函数示例:

def greet(name):       print("Hello, " + name + "!")greet("Alice")

输出:

Hello, Alice!

在这个例子中,greet函数接受一个参数name,并在控制台上打印出一条问候语。

函数可以返回一个值,使用关键字return。以下是一个返回两个数之和的函数示例:

def add_numbers(x, y):      return x + yresult = add_numbers(3, 5)print(result)

输出:

8

在这个例子中,add_numbers函数接受两个参数x和y,并返回它们的和。我们将函数的返回值存储在变量result中,并在控制台上打印出来。

函数可以有默认参数值,这些值在函数被调用时可以被覆盖。以下是一个带有默认参数值的函数示例:

def greet(name, greeting="Hello"):      print(greeting + ", " + name + "!")greet("Alice")greet("Bob", "Hi")

输出:

Hello, Alice!Hi, Bob!

在这个例子中,greet函数有一个默认参数值greeting="Hello"。如果我们不提供greeting参数,函数将使用默认值。如果我们提供了greeting参数,它将覆盖默认值。

函数可以接受任意数量的参数,使用星号*。以下是一个接受任意数量参数的函数示例:

def print_numbers(*numbers):      for number in numbers:            print(number)print_numbers(1, 2, 3)print_numbers(4, 5, 6, 7)

输出:

1234567

在这个例子中,print_numbers函数接受任意数量的参数,并使用for循环打印它们。

函数可以嵌套在其他函数中。以下是一个嵌套函数的示例:

def outer_function():      print("Outer function")      def inner_function():            print("Inner function")      inner_function()outer_function()

输出:

Outer functionInner function

在这个例子中,outer_function包含一个嵌套函数inner_function。当outer_function被调用时,它将打印一条消息并调用inner_function。inner_function也将打印一条消息。

函数可以作为参数传递给其他函数。以下是一个将函数作为参数的示例:

def add_numbers(x, y):      return x + ydef apply_function(f, x, y):      return f(x, y)result = apply_function(add_numbers, 3, 5)print(result)

输出:

8

在这个例子中,apply_function函数接受一个函数f和两个参数x和y。它将调用f(x, y)并返回结果。我们将add_numbers函数作为参数传递给apply_function,并将结果存储在变量result中。

七丶面向对象

Python是一种面向对象的编程语言,它支持面向对象编程(OOP)。面向对象编程是一种编程范式,它将数据和操作数据的方法组合在一起,形成一个对象。在Python中,对象是由类定义的,类是一种用户定义的数据类型,它包含数据和方法。

Python中的面向对象编程有以下几个关键概念:

类(Class):类是一种用户定义的数据类型,它定义了一组属性和方法。类是创建对象的模板。对象(Object):对象是类的实例,它包含了类定义的属性和方法。属性(Attribute):属性是对象的数据成员,它可以是变量或常量。方法(Method):方法是对象的操作成员,它可以是函数或过程。继承(Inheritance):继承是一种机制,它允许一个类继承另一个类的属性和方法。多态(Polymorphism):多态是一种机制,它允许不同的对象对同一消息做出不同的响应。

下面是一个简单的Python类的例子:

class Person:      def __init__(self, name, age):            self.name = name            self.age = age     def say_hello(self):           print("Hello, my name is", self.name, "and I am", self.age, "years old.")person1 = Person("Alice", 25)person1.say_hello()

在这个例子中,我们定义了一个名为Person的类,它有两个属性(name和age)和一个方法(say_hello)。我们使用__init__方法来初始化对象的属性,使用self关键字来引用对象本身。我们还定义了一个say_hello方法,它打印出对象的属性。

我们创建了一个名为person1的Person对象,并调用了它的say_hello方法。输出结果为:

Hello, my name is Alice and I am 25 years old.

这是一个简单的面向对象编程的例子,它展示了Python中类和对象的基本概念。在实际编程中,面向对象编程可以帮助我们更好地组织代码,提高代码的可重用性和可维护性。

在Python中,继承是面向对象编程的一个重要概念。继承允许我们创建一个新的类,该类继承了另一个类的属性和方法。被继承的类称为父类或基类,继承的类称为子类或派生类。

继承

在Python中,继承的语法如下:

class ParentClass:     # 父类的属性和方法class ChildClass(ParentClass):     # 子类的属性和方法

在这个例子中,ChildClass 继承了 ParentClass 的所有属性和方法。子类可以使用父类的方法和属性,也可以添加自己的方法和属性。

例如,我们可以定义一个 Person类作为父类,然后定义一个 Student类作为子类,继承 Person类的属性和方法:

class Person:     def __init__(self, name, age):           self.name = name           self.age = age     def say_hello(self):           print("Hello, my name is", self.name)class Student(Person):     def __init__(self, name, age, grade):           super().__init__(name, age)           self.grade = grade     def say_hello(self):           super().say_hello()           print("I am a student in grade", self.grade)

在这个例子中,Student类继承了 Person类的 __init__ 方法和 say_hello 方法。子类中的 __init__ 方法使用 super()函数调用父类的 __init__方法,以便子类可以继承父类的属性。子类中的 say_hello方法使用 super() 函数调用父类的 say_hello方法,并添加了自己的打印语句。

现在我们可以创建一个 Student对象并调用它的方法:

student = Student("Alice", 15, 9)student.say_hello()

输出结果为:

Hello, my name is AliceI am a student in grade 9

这个例子展示了如何使用继承来创建一个子类,并继承父类的属性和方法。子类可以添加自己的方法和属性,也可以重写父类的方法。

封装

在Python中,封装是指将数据和方法包装在一个类中,以保护数据不被外部直接访问和修改。这样可以确保数据的安全性和一致性,同时也可以隐藏实现细节,使代码更加简洁和易于维护。

Python中实现封装的方式是通过使用访问控制符来限制对类的属性和方法的访问。Python中有两种访问控制符:公有和私有。

公有属性和方法可以被类的外部访问,私有属性和方法只能在类的内部访问。在Python中,私有属性和方法的命名规则是在属性或方法名前加上两个下划线“__”。

下面是一个简单的例子,演示了如何在Python中实现封装:

class Person:     def __init__(self, name, age):           self.__name = name           self.__age = age     def get_name(self):           return self.__name     def get_age(self):           return self.__age      def set_name(self, name):           self.__name = name     def set_age(self, age):           self.__age = agep = Person("Tom", 20)print(p.get_name()) # 输出:Tomprint(p.get_age()) # 输出:20p.set_name("Jerry")p.set_age(25)print(p.get_name()) # 输出:Jerryprint(p.get_age()) # 输出:25# 下面这行代码会报错,因为__name是私有属性,外部无法直接访问# print(p.__name)

在上面的例子中,我们定义了一个Person类,包含了两个私有属性__name和__age,以及四个公有方法get_name、get_age、set_name和set_age。通过这些方法,我们可以获取和修改对象的属性值,同时保证了属性的安全性。

需要注意的是,Python中的私有属性和方法并不是真正的私有,只是通过命名规则来实现的。如果知道了私有属性和方法的名称,仍然可以在类的外部访问和修改它们。因此,封装并不是完全保证数据的安全性,而是提高了数据的安全性和可维护性。

类的专有方法

在Python中,类的专有方法是指以双下划线开头和结尾的方法,也称为魔术方法或特殊方法。这些方法在类的实例化、属性访问、运算符重载等方面起着重要作用。以下是一些常用的类的专有方法:

init(self, ...):构造方法,用于初始化对象的属性。str(self):返回对象的字符串表示,可以通过print()函数输出。repr(self):返回对象的字符串表示,可以通过交互式命令行输出。getattr(self, name):当访问不存在的属性时调用。setattr(self, name, value):当设置属性值时调用。delattr(self, name):当删除属性时调用。len(self):返回对象的长度,可以通过len()函数调用。getitem(self, key):当通过索引访问对象时调用。setitem(self, key, value):当通过索引设置对象的值时调用。delitem(self, key):当通过索引删除对象时调用。eq(self, other):当比较两个对象是否相等时调用。lt(self, other):当比较两个对象大小时调用。八丶异常与文件处理

异常处理:

在Python中,异常处理是一种处理程序中出现错误的方式。当程序出现错误时,Python会引发异常。异常是一种Python对象,表示程序中的错误或异常情况。Python提供了try-except语句来捕获和处理异常。

try-except语句的基本语法如下:

try:     # 代码块except ExceptionType:     # 异常处理代码块

其中,try语句块中包含可能引发异常的代码,如果try语句块中的代码引发了异常,则会跳转到except语句块中执行异常处理代码。

文件处理:

Python中的文件处理包括文件的读取、写入和关闭等操作。Python提供了`open()`函数来打开文件,可以指定文件名、打开模式和编码方式等参数。

打开文件的基本语法如下:

file = open(filename, mode, encoding)

其中,filename是文件名,mode是打开模式,encoding是编码方式。打开模式包括:

'r':只读模式,打开文件后只能读取文件内容,不能修改文件内容。'w':写入模式,打开文件后可以写入文件内容,如果文件不存在则创建文件,如果文件已存在则清空文件内容。'a':追加模式,打开文件后可以在文件末尾追加内容,如果文件不存在则创建文件。'x':独占模式,打开文件后只能写入文件内容,如果文件已存在则抛出FileExistsError异常。'b':二进制模式,打开文件时以二进制方式读取或写入文件内容。

文件打开后,可以使用read()、write()和close()等方法来读取、写入和关闭文件。

读取文件的基本语法如下:

content = file.read()

其中,file是文件对象,read()方法用于读取文件内容。

写入文件的基本语法如下:

file.write(content)

其中,file是文件对象,write()方法用于写入文件内容。

关闭文件的基本语法如下:

file.close()

其中,file是文件对象,close()方法用于关闭文件。

下章讲:python并发编程

更多内容:

1.面试PDF+100道大厂面试2.入门基础教程3.11模块零基础到精通笔记4.百个项目实战+爬虫教程+代码5.量化交易,机器学习,深度学习6.Python游戏源码7.交流学习

私信(python)领取

标签: #python父类子类属性的get和set方法 #apacherewrite语法