victory的博客

长安一片月,万户捣衣声

0%

一对多自定义映射、分步查询和延迟加载

1.项目目录

2.Dept.java
在”一”方添加List<多>

package com.atguigu.bean;

import java.util.List;

public class Dept {
    private Integer did;
    private String dname;
    private List<Emp> emps;
    
    public List<Emp> getEmps() {
        return emps;
    }
    public void setEmps(List<Emp> emps) {
        this.emps = emps;
    }
    public Integer getDid() {
        return did;
    }
    public void setDid(Integer did) {
        this.did = did;
    }
    public String getDname() {
        return dname;
    }
    public void setDname(String dname) {
        this.dname = dname;
    }
    @Override
    public String toString() {
        return "Dept [did=" + did + ", dname=" + dname + ", emps=" + emps + "]";
    }
}

3.EmpDeptMapper.java

package com.atguigu.mapper;

import java.util.List;

import com.atguigu.bean.Dept;
import com.atguigu.bean.Emp;

public interface EmpDeptMapper {
    List<Emp> getAllEmp();
    
    Emp getEmpStep(String eid);
    
    Dept getDeptEmpsByDid(String did);
    
    Dept getOnlyDeptByDid(String did);//测试一对多
    
    List<Emp> getEmpListByDid(String did);//测试一对多
}

4.EmpDeptMapper.xml
在映射文件中做以下配置:

<resultMap type="Dept" id="deptMapStep">
    <id column="did" property="did" />
    <result column="dname" property="dname" />
    <!-- <collection property="emps" select="com.atguigu.mapper.EmpDeptMapper.getEmpListByDid" column="did"></collection> -->
    <!-- 
        fetchType:
            lazy 延迟加载
            eager 不进行延迟加载
     -->
    <collection property="emps" select="com.atguigu.mapper.EmpDeptMapper.getEmpListByDid" column="{did=did}" fetchType="lazy"></collection>
</resultMap>

<!-- Dept getOnlyDeptByDid(String did); -->
<select id="getOnlyDeptByDid" resultMap="deptMapStep">
    select did,dname from dept where did=#{did}
</select>

<!-- List<Emp> getEmpListByDid(String did); -->
<select id="getEmpListByDid" resultType="Emp">
    select eid,ename,age,sex from emp where did = #{did}
</select>

5.TestEmpDept.java

package com.atguigu.test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import com.atguigu.bean.Dept;
import com.atguigu.bean.Emp;
import com.atguigu.mapper.EmpDeptMapper;

public class TestEmpDept {
    public static void main(String[] args) throws IOException {
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        EmpDeptMapper mapper = sqlSession.getMapper(EmpDeptMapper.class);
        
//        List<Emp> empList = mapper.getAllEmp();
//        System.out.println(empList);
        
//        Emp emp = mapper.getEmpStep("3");
//        System.out.println(emp.getEname());
//        System.out.println(emp.getDept());
        
//        Dept dept = mapper.getDeptEmpsByDid("2");
//        System.out.println(dept);
        
        Dept dept = mapper.getOnlyDeptByDid("3");
        //System.out.println(dept);
        System.out.println(dept.getDname());
        System.out.println(dept.getEmps());
    }
}

分步查询、分步查询延迟加载

项目目录

1.mybatis-config.xml
分步查询延迟加载需要在MyBatis核心配置文件中做以下配置:

<settings>
    <!-- 开启延迟加载 -->
    <setting name="lazyLoadingEnabled" value="true"></setting>
    <!-- 是否查询所有数据 -->
    <setting name="aggressiveLazyLoading" value="false"></setting>
</settings>

2.DeptMapper.java

public interface DeptMapper {
    Dept getDeptByDid(String did);
}

3.DeptMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 
<mapper namespace="com.atguigu.mapper.DeptMapper">
    <select id="getDeptByDid" resultType="Dept">
        select did,dname from dept where did=#{did}
    </select>
</mapper>

4.EmpDeptMapper.java

public interface EmpDeptMapper {
    List<Emp> getAllEmp();
    
    Emp getEmpStep(String eid);//分步查询
}

5.EmpDeptMapper.xml
添加查询语句

<resultMap type="Emp" id="empMapStep">
    <id column="eid" property="eid"/>
    <result column="ename" property="ename"/>
    <result column="age" property="age"/>
    <result column="sex" property="sex"/>
    <!--
        select:分步查询的SQL的id,即接口全限定名.方法名或者namespace.SQL的id
        column:分步查询的条件,注意:此条件必须是从数据库查询过的 
     -->
    <association property="dept" select="com.atguigu.mapper.DeptMapper.getDeptByDid" column="did"></association>
</resultMap>

<!-- Emp getEmpStep(String eid); -->
<select id="getEmpStep" resultMap="empMapStep">
    select eid,ename,age,sex,did from emp where eid = #{eid}
</select>

6.TestEmpDept.java

public class TestEmpDept {
    public static void main(String[] args) throws IOException {
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        EmpDeptMapper mapper = sqlSession.getMapper(EmpDeptMapper.class);
        
        Emp emp = mapper.getEmpStep("3");
        System.out.println(emp.getEname());
        System.out.println(emp.getDept());
    }
}

7.运行结果
执行emp.getEname()运行结果为前四行
再执行emp.getDept()运行结果为八行

DEBUG 04-06 09:48:10,087 ==>  Preparing: select eid,ename,age,sex,did from emp where eid = ?   (BaseJdbcLogger.java:145) 
DEBUG 04-06 09:48:10,102 ==> Parameters: 3(String)  (BaseJdbcLogger.java:145) 
DEBUG 04-06 09:48:10,147 <==      Total: 1  (BaseJdbcLogger.java:145) 
王五
DEBUG 04-06 09:48:10,147 ==>  Preparing: select did,dname from dept where did=?   (BaseJdbcLogger.java:145) 
DEBUG 04-06 09:48:10,148 ==> Parameters: 3(Integer)  (BaseJdbcLogger.java:145) 
DEBUG 04-06 09:48:10,149 <==      Total: 1  (BaseJdbcLogger.java:145) 
Dept [did=3, dname=研发部]

多对一查询自定义映射

1.项目目录

2.Emp.java

package com.atguigu.bean;

public class Emp {
    private Integer eid;
    private String ename;
    private Integer age;
    private String sex;
    private Dept dept;
    
    
    public Dept getDept() {
        return dept;
    }
    public void setDept(Dept dept) {
        this.dept = dept;
    }
    public Integer getEid() {
        return eid;
    }
    public void setEid(Integer eid) {
        this.eid = eid;
    }
    public String getEname() {
        return ename;
    }
    public void setEname(String ename) {
        this.ename = ename;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    
    @Override
    public String toString() {
        return "Emp [eid=" + eid + ", ename=" + ename + ", age=" + age + ", sex=" + sex + ", dept=" + dept + "]";
    }
    public Emp(Integer eid, String ename, Integer age, String sex) {
        super();
        this.eid = eid;
        this.ename = ename;
        this.age = age;
        this.sex = sex;
    }
    public Emp() {
        super();
        // TODO Auto-generated constructor stub
    }
}

3.Dept.java

package com.atguigu.bean;

public class Dept {
    private Integer did;
    private String dname;
    public Integer getDid() {
        return did;
    }
    public void setDid(Integer did) {
        this.did = did;
    }
    public String getDname() {
        return dname;
    }
    public void setDname(String dname) {
        this.dname = dname;
    }
    @Override
    public String toString() {
        return "Dept [did=" + did + ", dname=" + dname + "]";
    }
    
}

4.EmpDeptMapper.java

package com.atguigu.mapper;

import java.util.List;

import com.atguigu.bean.Emp;

public interface EmpDeptMapper {
    List<Emp> getAllEmp();
}

5.EmpDeptMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 
<mapper namespace="com.atguigu.mapper.EmpDeptMapper">
    
    <!-- <select id="getAllEmp" resultType="Emp">
        select e.eid,e.ename,e.age,e.sex,e.did,d.dname from emp e left join dept d on e.did=d.did
        
            查询结果:
            [Emp [eid=1, ename=张三, age=12, sex=男, dept=null], 
            不能够查询出员工所对应的部门,需要进行自定义映射
        
    </select> -->
    
    <!-- 自定义映射-第一种方式 -->
    <!-- <resultMap type="Emp" id="empMap">
        <id column="eid" property="eid"/>
        <result column="ename" property="ename"/>
        <result column="age" property="age"/>
        <result column="sex" property="sex"/>
        <result column="did" property="dept.did"/>
        <result column="dname" property="dept.dname"/>
    </resultMap> -->
    <!--
        <resultMap>:自定义映射,处理复杂的表关系
        <id/>:设置主键的映射关系,column设置字段名,property设置属性名
        <result/>:设置非主键的映射关系, column设置字段名,property设置属性名
     -->
     
     <!-- 自定义映射-第二种方式 -->
     <resultMap type="Emp" id="empMap">
        <id column="eid" property="eid"/>
        <result column="ename" property="ename"/>
        <result column="age" property="age"/>
        <result column="sex" property="sex"/>
        <association property="dept" javaType="Dept">
            <id column="did" property="did"/>
            <result column="dname" property="dname"/>
        </association>
     </resultMap>
    
    <!-- List<Emp> getAllEmp(); -->
    <select id="getAllEmp" resultMap="empMap">
        <!-- select * from emp e, dept d where e.did = d.did -->
        select e.eid,e.ename,e.age,e.sex,e.did,d.dname from emp e left join dept d on e.did=d.did
    </select>
</mapper>

6.TestEmpDept.java

package com.atguigu.test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import com.atguigu.bean.Emp;
import com.atguigu.mapper.EmpDeptMapper;

public class TestEmpDept {
    public static void main(String[] args) throws IOException {
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        EmpDeptMapper mapper = sqlSession.getMapper(EmpDeptMapper.class);
        
        List<Emp> empList = mapper.getAllEmp();
        System.out.println(empList);
    }
}

MyBatis获取参数值的两种方式

1.${}:insert into emp values(null,admin,23,男)
Statement:
必须使用字符串拼接的方式操作SQL,一定要注意单引号问题
不能防止SQL注入
2.#{}:insert into emp values(null,?,?,?)
PreparedStatement:
可以使用通配符操作SQL,因为在为String赋值时可以自动加单引号,因此不需要注意单引号问题
可以防止SQL注入
使用建议:**建议使用#{}**,在特殊情况下,需要使用${},例如模糊查询和批量删除

不同的参数类型,${}和#{}的不同取值方式:

1、当传输参数为单个String或基本数据类型和其包装类型
#{}:可以以任意的名字获取参数值
${}:只能以${value}或${_parameter}获取
2、当传输参数为JavaBean时
#{}和${}都可以通过属性名直接获取属性值,但是要注意${}的单引号问题
3、当传输多个参数时,mybatis会默认将这些参数放在map集合中
两种方式:
(1)键为0,1,2,3…N-1,以参数为值
(2)键为param1,param2,param3…paramN,以参数为值
#{}:#{0}、#{1};#{param1}、#{param2}
${}:#{param1}、{param2},但是要注意${}的单引号问题
4、当传输Map参数时
#{}和${}都可以通过键的名字直接获取值,但是要注意${}的单引号问题
5、命名参数
可以通过@Param(“key”)为map集合指定键的名字
Emp getEmpByEidAndEnameByParam(@Param(“eid”)String eid, @Param(“ename”)String ename);
6、当传输参数为List或Array,mybatis会将List或Array放在map中
List以list为键,Array以array为键

Statement与PreparedStatement

package com.atguigu.test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.Statement;

import com.atguigu.bean.Emp;

public class TestJDBC {
    public static void main(String[] args) throws Exception {
        Class.forName("");
        Connection conn = DriverManager.getConnection("","","");
        //可以使用通配符赋值
        PreparedStatement ps = conn.prepareStatement("insert into emp values(null, ?, ?,?");
        ps.setString(1, "root");
        ps.setString(2, "23");
        ps.setString(3, "男");
        ps.executeUpdate();
        
        Statement statement = conn.createStatement();
        Emp emp = new Emp(null, "a", 1, "b");
        //不可以使用通配符赋值
        statement.executeUpdate("insert into emp values(null, '"+emp.getEname()+"', "+emp.getAge()+", '"+emp.getSex()+"')");
    }
}
阅读全文 »

MyBatis三种查询方式

1.项目目录

2.EmpSelectMapper.java

package com.atguigu.mapper;

import java.util.Map;

import org.apache.ibatis.annotations.MapKey;

import com.atguigu.bean.Emp;

public interface EmpSelectMapper {
    //根据eid查询一个员工信息
    Emp getEmpByEid(String eid);
    
    //获取所有的员工数量
    Integer getCount();
    
    //以map集合获取一个员工信息
    Map<String, Object> getEmpMapByEid(String eid);
    
    //以map集合获取所有员工信息
    
    @MapKey("eid")//设置map的建,因为在查询时传出所有的员工信息,可以把员工信息作为值,但是必须设置键
    Map<String, Object> getAllEmpMap();
}

3.EmpSelectMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 
<mapper namespace="com.atguigu.mapper.EmpSelectMapper">
    
    
    <!-- //根据eid查询一个员工信息
    Emp getEmpByEid(String eid); -->
    <select id="getEmpByEid" resultType="Emp">
        select eid,ename,age,sex from emp where eid=#{eid}
    </select>
    
    <!-- //获取所有的员工数量
    Integer getCount(); -->
    <select id="getCount" resultType="Integer">
        select count(eid) from emp
    </select>
    
    <!-- //以map集合获取一个员工信息
    Map<String, Object> getEmpMapByEid(String eid); -->
    <select id="getEmpMapByEid" resultType="java.util.HashMap">
        select eid,ename,age,sex from emp where eid=#{eid}
    </select>
    
    <!-- //以map集合获取所有员工信息
    @MapKey("eid")//设置map的建,因为在查询时传出所有的员工信息,可以把员工信息作为值,但是必须设置键
    Map<String, Object> getAllEmpMap(); -->
    <select id="getAllEmpMap" resultType="Emp">
    select eid,ename,age,sex from emp
    </select>
    
</mapper>

4.TestSelect.java

package com.atguigu.test;

import java.io.IOException;
import java.io.InputStream;
import java.util.Map;

import javax.annotation.Resource;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

import com.atguigu.bean.Emp;
import com.atguigu.mapper.EmpSelectMapper;

public class TestSelect {
    @Test
    public void testSelect() throws IOException{
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        EmpSelectMapper mapper = sqlSession.getMapper(EmpSelectMapper.class);
        //若查询出的数据有多条,则绝不能将接口中方法的返回值设置为Javabean
//        Emp emp = mapper.getEmpByEid("3");
//        System.out.println(emp);
        
        //获取员工总记录数
//        Integer i = mapper.getCount();
//        System.out.println(i);
        
        //以map获取单个emp
//        Map<String, Object> map = mapper.getEmpMapByEid("6");
//        System.out.println(map);
        
        //以map获取所有emp
        Map<String, Object> map = mapper.getAllEmpMap();
        System.out.println(map);
    }
}

MyBatis CRUD

按照MyBatis搭建过程进行项目搭建,
并在mybatis-config.xml中将按如下方式引入映射文件:

<!-- 引入映射文件 -->
<mappers>
    <!-- <mapper resource="EmpMapper.xml" />
    <mapper resource="DeptMapper.xml"></mapper> -->
    
    <!-- 此种写法要求mapper接口和mapper映射文件在同一个包下 -->
    <package name="com.atguigu.mapper"/>
    
</mappers>

CRUD 案例

1.项目目录

2.Emp.java

package com.atguigu.bean;

public class Emp {
    private Integer eid;
    private String ename;
    private Integer age;
    private String sex;
    public Integer getEid() {
        return eid;
    }
    public void setEid(Integer eid) {
        this.eid = eid;
    }
    public String getEname() {
        return ename;
    }
    public void setEname(String ename) {
        this.ename = ename;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    public String getSex() {
        return sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
    @Override
    public String toString() {
        return "Emp [eid=" + eid + ", ename=" + ename + ", age=" + age + ", sex=" + sex + "]";
    }
    public Emp(Integer eid, String ename, Integer age, String sex) {
        super();
        this.eid = eid;
        this.ename = ename;
        this.age = age;
        this.sex = sex;
    }
    public Emp() {
        super();
        // TODO Auto-generated constructor stub
    }
    
    
    
}

3.EmpMapper.java

package com.atguigu.mapper;

import java.util.List;

import com.atguigu.bean.Emp;

public interface EmpMapper {
    //根据eid查询员工信息
    Emp getEmpByEid(String eid);
    
    //获取所有的员工信息
    List<Emp> getAllEmp();
    
    //添加员工信息
    void addEmp(Emp emp);
    
    //修改员工信息
    void updateEmp(Emp emp);
    
    //删除员工信息
    Integer deleteEmp(String id);
}

4.EmpMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 
<mapper namespace="com.atguigu.mapper.EmpMapper">
    <!-- Emp getEmpByEid(String eid); -->
    <select id="getEmpByEid" resultType="Emp">
        select eid,ename,age,sex from emp where eid=#{eid}
    </select>
    
    <!-- List<Emp> getAllEmp(); -->
    <select id="getAllEmp" resultType="Emp">
        select eid,ename,age,sex from emp
    </select>
    
    <!-- void addEmp(Emp emp); -->
    <insert id="addEmp">
        insert into emp values(null, #{ename}, #{age}, #{sex})
    </insert>
    
    <!-- void updateEmp(Emp emp); -->
    <update id="updateEmp" parameterType="Emp">
        update emp set ename=#{ename},age=#{age},sex=#{sex} where eid=#{eid}
    </update>
    
    <!-- void deleteEmp(String id);  -->
    <delete id="deleteEmp">
        delete from emp where eid=#{eid}
    </delete>
</mapper>

5.TestCRUD.java

package com.atguigu.test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

import com.atguigu.bean.Emp;
import com.atguigu.mapper.EmpMapper;

public class TestCRUD {
    @Test
    public void testCRUD() throws IOException{
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
//        SqlSession sqlSession = sqlSessionFactory.openSession();//需要手动处理事务
        SqlSession sqlSession = sqlSessionFactory.openSession(true);//自动处理事务
        EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class);
        //测试:根据eid获取员工信息
//        Emp emp = empMapper.getEmpByEid("3");
//        System.out.println(emp);
        
        //测试:获取所有的员工信息
//        List<Emp> list = empMapper.getAllEmp();
//        System.out.println(list);
        
        //测试:添加员工信息
//        empMapper.addEmp(new Emp(null,"admin",23,"女"));
//        sqlSession.commit();//提交事务
        
        //测试:修改员工信息
        empMapper.updateEmp(new Emp(2, "张二", 33, "女"));
        
        //测试:删除员工信息
//        Integer rowNum = empMapper.deleteEmp("5");
//        System.out.println(rowNum);//返回值类型为Integer:返回受影响的行数 Boolean:·
    }
}

MyBatis搭建过程

1.导入MyBatis框架的jar包、Mysql驱动包、log4j的jar包

myBatis-3.4.1.jar
mysql-connector-java-5.1.37-bin.jar
log4j.jar

2.创建MyBatis的核心(全局)配置文件mybatis-config.xml并配置(如何连接数据库)
3.创建映射文件XxxMapper.xml并配置(如何操作数据库)
4.创建mapper接口,实现两个绑定:
4.1接口全限定名要和映射文件的namespace保持一致
4.2接口中方法名和SQL语句的id保持一致
5.获取MyBatis操作数据库的会话对象SqlSession,通过getMapper()获取接口的动态代理实现类

InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);

6、测试

阅读全文 »

迭代器

# 创建一个返回数字的迭代器,初始值为 1,逐步递增 1:
class MyNumbers:
    def __iter__(self):
        self.a = 0
        return self

    def __next__(self):
        self.a = self.a + 1
        return self.a

# 奇数迭代器
class MyOddNumbers:
    def __iter__(self):
        self.num = 1
        return self

    def __next__(self):
        self.num = self.num + 2
        return self.num

# 偶数迭代器
class MyEvenNumbers:
    def __iter__(self):
        self.num = 0
        return self

    def __next__(self):
        self.num = self.num + 2
        return self.num

myclass = MyNumbers()
myiter = iter(myclass)
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))
print("======================================")
my_odd_numbers = MyOddNumbers()
my_odd_numbers_iter = iter(my_odd_numbers)
print(next(my_odd_numbers_iter))
print(next(my_odd_numbers_iter))
print(next(my_odd_numbers_iter))
print(next(my_odd_numbers_iter))
print("======================================")
my_even_numbers = MyEvenNumbers()
my_even_numbers_iter = iter(my_even_numbers)
print(next(my_even_numbers_iter))
print(next(my_even_numbers_iter))
print(next(my_even_numbers_iter))
print(next(my_even_numbers_iter))

property和property装饰器

class Student:
    def __init__(self, name):
        self.__name = name

    def get_name(self):
        return self.__name

    def set_name(self, new_name):
        self.__name = new_name

    name = property(get_name, set_name)

s = Student("张三")
s.name = "李四"
print(s.name)

class Student:
    def __init__(self, name):
        self.__name = name

    @property
    def name(self):
        return self.__name
    @name.setter
    def name(self, new_name):
        self.__name = new_name

s = Student("张三")
s.name = "李四"
print(s.name)