第十章第2讲:面向对象的高级编程:动态语言

1.体验python动态语言的魅力

# 定义一个空类,实例化后,给实例绑定属性与方法
class Person(object):
    pass

s = Person()
# 给实例s绑定属性
s.name = "Ann"
print(s.name)

def set_age(self,age):
    self.age = age

from types import MethodType
s.set_age = MethodType(set_age,s)
s.set_age = 25
print(s.set_age)
# 给一个实例绑定的方法,对另外的实例不起作用
s2 = Person()
# s2调用s绑定的set_age方法,会报错
s2.set_age = 24
print(s2.age)
给s绑定的属性,在s2中也不可用
print(s2.name)

2.给空类绑定属性和方法

# 定义一个空类,给空类绑定方法
class Person(object):
    pass

p1= Person()

def set_age(self,age):
    self.age = age
Person.set_age = set_age
p1 = Person()
p1.set_age(20)
print(p1.age)
p2 = Person()
p2.set_age(30)
print(p2.age)

  给类绑定方法

# 定义一个空类,给空类绑定方法
class Person(object):
    pass

p1= Person()

def set_age(self,age):
    self.age = age

m1 = Person()
m2 = Person()
from types import MethodType
Person.set_age = MethodType(set_age,Person)
m1.set_age(14)
m2.set_age(24)
# 通过MethodType给类绑定方法后,set_age就是设置类的属性
print(m1.age)
print(m2.age)
# 下面的代码分别给m1,m2实例增加属性,并赋值20,30
m1.age = 20
m2.age = 30
print(m1.age,m2.age)

结果:
24
24
20 30

3.__slots__限制

# 使用__slots__现在实例随意添加属性
class Person(object):
    __slots__ = ("name","age")
m1 = Person()
m1.name = "Ann"
m1.age = 30
print(m1.name,m1.age)
# 由于weight没有被放在__slots__中,所以不能绑定weight属性
m1.weight = 40

使用__slots__注意:仅仅对当前类实例起作用,对继承该类的子类不起作用

# 使用__slots__现在实例随意添加属性
class Person(object):
    __slots__ = ("name","age")
m1 = Person()
m1.name = "Ann"
m1.age = 30
print(m1.name,m1.age)

# 使用__slots__注意:仅仅对当前类实例起作用,对继承该类的子类不起作用
class Student(Person):
    pass
s = Student()
s.name = "Bela"
s.age = 24
s.weight = 50
print(s.name,s.age)
print(s.weight)

总结:一般在规划类的时候,属性与方法均设计好了

原文地址:https://www.cnblogs.com/ling07/p/11255721.html

时间: 2024-10-28 07:26:22

第十章第2讲:面向对象的高级编程:动态语言的相关文章

Python 面向对象之高级编程

7.面向对象高级编程 7.1使用__slots__ python动态语言,new 对象后绑定属性和方法 Tip:给一个实例绑定的方法,对其他对象无效.可以通过对class绑定后,所有对象可以调用该方法 如果我们现在只有实例可以添加属性,使用__slots__,只允许对Student实例添加name和age属性, 添加其他属性报错 class Student(object): __slots__ = ('name', 'age') # 用tuple定义允许绑定的属性名称 该限定只对当前对象起作用,

面向对象的高级编程

1.给类对象绑定的函数,只对这个对象生效, 而对类绑定的对象, 所有的对象都可以调用. 栗子: def set_score(self, score): self.score = score s.set_age = MethodType(set_score, s) #对象绑定 Student.set_score = MethodType(set_score, Student) #绑定类 动态绑定允许我们在程序运行的过程中动态给class加上功能,这在静态语言中很难实现 2.使用__slots__

Boolan C++面向对象高级编程学习第五周

本周C++面向对象高级编程编程主要是讲三个方面 1.虚表和虚指针 虚指针:如果类(包括父类)中有虚函数,就一定会有虚指针,虚指针是指向虚函数的虚表. 虚表:虚指针指向的一种类的表,表上存有类里面虚函数的实现的指针 这里虚函数和虚表一般是和类的多太性结合在一起来使用的,子类调用虚函数是通过调用虚指针来调用虚函数表里面的指针再来实现函数特性 这种调用的方式叫做动态绑定,是一种通过指针类型自动来判断调用的对象,在实现中可以不用区分哪个对象从而调用对应的函数 我们普通的调用类里面的函数叫做静态绑定 2.

Python3 面向对象 高级编程

正常情况下,当我们定义了一个class,创建了一个class的实例后,我们可以给该实例绑定任何属性和方法,这就是动态语言的灵活性.  class Student(object): pass 然后,尝试给实例绑定一个属性: >>> s = Student() >>> s.name = 'Michael' # 动态给实例绑定一个属性 还可以尝试给实例绑定一个方法: >>> def set_age(self, age): # 定义一个函数作为实例方法 ...

C++面向对象高级编程(九)Reference与重载operator new和operator delete

摘要: 技术在于交流.沟通,转载请注明出处并保持作品的完整性. 一 Reference 引用:之前提及过,他的主要作用就是取别名,与指针很相似,实现也是基于指针. 1.引用必须有初值,且不能引用nullptr 2.引用之后不能再引用别人 3.引用通常不用于声明变量,多用于参数类型,和返回值类型 见下面代码 int main(int argc, const char * argv[]) { int x=0; //p is a pointer to x int* p = &x; // r is a

python 之面向对象高级编程

数据封装.继承和多态只是面向对象程序设计中最基础的3个概念.在Python中,面向对象还有很多高级特性,允许我们写出非常强大的功能. 我们会讨论多重继承.定制类.元类等概念. 使用__slots__ 正常情况下,当我们定义了一个class,创建了一个class的实例后,我们可以给该实例绑定任何属性和方法,这就是动态语言的灵活性.先定义class: class Student(object): pass 然后,尝试给实例绑定一个属性: >>> s = Student() >>&

C++面向对象高级编程(七)point-like classes和function-like classes

技术在于交流.沟通,转载请注明出处并保持作品的完整性. 1.pointer-like class 类设计成指针那样,可以当做指针来用,指针有两个常用操作符(*和->),所以我们必须重载这两个操作 /*简单实现一下智能指针的*与 -> 操作符*/ template <class T> class shared_ptr_test { public: T& operator* () const //重载* { return *px; } T* operator->() co

python基础之面向对象高级编程

面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个"函数"供使用(可以讲多函数中公用的变量封装到对象中) 对象,根据模板创建的实例(即:对象),实例用于调用被包装在类中的函数 面向对象三大特性:封装.继承和多态 本篇将详细介绍Python 类的成员.成员修饰符.类的特殊成员. 类的成员 类的成员可以分为三大类:字段.方法和属性 注:所有成员中,只有普通字段的内容保存对象中,即:根据此类创建了多少对象,在内存中就有

javascript面向对象创建高级 Web 应用程序

 目录 JavaScript 对象是词典 JavaScript 函数是最棒的 构造函数而不是类 原型 静态属性和方法 闭包 模拟私有属性 从类继承 模拟命名空间 应当这样编写 JavaScript 代码吗? 展望 最近,我面试了一个有五年 Web 应用程序开发经验的软件开发人员.四年半来她一直在从事 JavaScript 相关的工作,她自认为 JavaScript 技能非常好,但在不久之后我就发现实际上她对 JavaScript 知之甚少.话虽这样说,但我确实没有责备她的意思.JavaScrip