[PY3]——面向对象编程(1)

类的对象


有三种对象


可以做什么操作


包括什么属性


类对象


属性引用、实例化


函数方法、内置的属性、类变量


实例对象


属性引用


函数方法、类变量、实例变量


方法对象

1. 类对象、实例对象、方法对象

类[class]是抽象的模型实例[instance]是根据类创建出来的一个个具体的“对象”

1.1  如何定义类

class 类名(表示该类是从哪个类继承下来的):   xxx
class ClassName:
    <statement-1>
    .
    .
    .
    <statement-N>

1.2  属性引用

class Myclass(object):
    ‘‘‘A simple example about class‘‘‘
    i=123
    def f(self):
        return "hello world"
    def __init__(self,name,score):
        self.name=name
        self.score=score

# 引用类变量、方法,都是合理的属性引用,分别返回一个整数和一个函数对象
print(Myclass.i)
123
print(Myclass.f) ->这就叫做创建了方法对象,但要注意这只是创建了对象但不是调用了这个方法
<function Student.f at 0x7f81f42c58c8>

# 类还有内置的属性可以被引用
print(Myclass.__doc__)
A simple example about class
print(Myclass.__name__)
Myclass
print(Myclass.__dict__)
{‘__doc__‘: ‘A simple example about class‘, ‘__init__‘: <function Myclass.__init__ at 0x7f0bf8fd0950>, ‘__module__‘: ‘__main__‘, ‘__weakref__‘: <attribute ‘__weakref__‘ of ‘Myclass‘ objects>, ‘i‘: 123, ‘__dict__‘: <attribute ‘__dict__‘ of ‘Myclass‘ objects>, ‘f‘: <function Myclass.f at 0x7f0bf8fd08c8>}
print(Myclass.__module__)
__main__
print(Myclass.__bases__)
(<class ‘object‘>,)
内置类 描述
__dict__ 类的属性
__doc__ 类的文档字符串
__name__ 类名
__module__ 类定义所在的模块
__bases__ 类的所有父类构成元素

1.3 实例化操作

# 实例化操作如下所示,赋值给一个变量,就能够创建一个实例对象
x=Myclass()y=Myclass()
print(x.i) 123 print(x.f()) hello world print(x.__doc__) A simple example about class
# 创建的实例对象可以自由地绑定属性x.iii="a9a"print(x.iii)a9a
# 创建的每个实例对象的内存地址都不一样print(x)<__main__.Myclass object at 0x7fbe7fa53160>print(y)<__main__.Myclass object at 0x7fbe7f7a8630>

1.4 __init__

# 上述的实例化操作创建了一个空的object
# 但在很多情况下,我们创建实例对象时,可能都需要有特定的初始状态。这个由__init__方法实现。
# 当一个类定义了 __init__() 方法, 类在实例化时会自动调用 __init__() 方法, 用于创建新的类实例
class Myclass(object):
    ‘‘‘A simple example about class‘‘‘
    i=123
    def f(self):
        return "hello world"

    def __init__(self,name,score):
        self.name=name
        self.score=score

# 关于__init__,要注意的是:    (1) __init__方法的第一个参数永远是self,表示创建的实例本身    (2) 有了__init__方法,在创建实例时就不能传入空的参数了,必须传入匹配的参数
x=Myclass()
TypeError: __init__() missing 2 required positional arguments: ‘name‘ and ‘score‘

x=Myclass("J",11)
print(x.name,x.score)
J 11

2. 属性之“变量属性”、作用域问题、访问限制问题

2.1  类变量、实例变量、作用域

class test:
    x=7                    #类的直接下级作用域的变量,叫做类变量

    def __init__(self,name):
        self.name=name      #实例中的变量,叫实例变量

instance1=test("name1")
instance2=test(‘name2‘)

# 类变量:既是类对象可见的属性、也是实例对象可见的属性
print(test.x)
7

print(instance1.x)
7

# 下面的例子中,instance1.x+=100本质是实例对象instance1新建了一个属性,覆盖了instance1.x这个变量
# 我们要知道,类变量可以是类对象的属性也可以是实例对象的属性,但实例对象的属性变化影响不了类对象的属性,也不会影响其他的实例对象
# 反之,类对象属性的变化倒是能影响实例对象的属性
test.x=100
print(instance1.x)
100
print(test.x)
100

instance1.x+=100
print(instance1.x)
107
print(test.x)
100
print(instance2.x)
100

2.2 访问限制

# 如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线__,在Python中,实例的变量名如果以__开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问
# 这样就确保了外部代码不能随意修改对象内部的状态,这样通过访问限制的保护,代码更加健壮

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

stu=Student(‘J‘,100)
print(stu.__score)
AttributeError: ‘Student‘ object has no attribute ‘__score‘

# 如果要允许外部访问者两个变量,可以增加get方法(get_name()和get_score())
# 如果又要允许外部修改这两个变量,可以增加set_score,虽然显得大费周折,但我们可以顺带对参数做个检查

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

    def get_name(self):
        return ‘{}‘.format(self.__name)

    def get_score(self):
        return ‘{}‘.format(self.__score)

    def print_stu(self):
        print(‘%s:%s‘ % (self.__name,self.__score))

    def set_score(self,score):
        if 0<=score<=100:
            self.__score=score
        else:
            raise ValueError(‘bad score‘)

stu=Student(‘J‘,100)
print(stu.get_name())
J
print(stu.get_score())
100
stu.print_stu()
J:100

stu.set_score(99);print(stu.get_score())
99
stu.set_score(101)
ValueError: bad score

3. 父类、子类(继承、多态)

# 基类/父类/超类(base class/super class) <—— 子类(subclass)

class Animal(object):
    def run(self):
        print("Animal is running...")

    def run2(self):
        print("111")

class Dog(Animal):
    def run(self):
        print("Dog is running...")

class Cat(Animal):
    def run(self):
        print("Cat is running...")

animal=Animal()
dog=Dog()
cat=Cat()

# 子类父类存在同名方法时,子类方法覆盖父类方法
dog.run()
Dog is running...
dog.run2()
111
cat.run()
Cat is running...

# 可以通过isinstance(obj, class_or_tuple, /),可以判断一个instance object是否属于某个类
print(isinstance(dog,Dog))
True
print(isinstance(dog,Animal))
True
print(isinstance(animal,Dog))
False

# issubclass(cls, class_or_tuple, /)class Base:
    Public_class_var=‘public class var‘     #类变量(public)
    __Private_class_var=‘private class var‘ #类变量(private)

    def __init__(self):
        self.public_instance_var=‘public instance var‘     #实例变量(public)
        self.__private_instance_var=‘private instance var‘ #实例变量(private)

    def public_instance_method(self):
        return ‘public instance method‘

    def __private_instance_method(self):
        return ‘private instance method‘

    @classmethod
    def public_class_method(cls):
        return ‘public class method‘

    @classmethod
    def __private_class_method(cls):
        return ‘private class method‘

    @staticmethod
    def public_static_method():
        return ‘public static method‘

    @staticmethod
    def __private_static_method():
        return ‘private static method‘

class Sub(Base):
   pass

sub=Sub()
print(sub.__dict__)
{‘_Base__private_instance_var‘: ‘private instance var‘, ‘public_instance_var‘: ‘public instance var‘}

# 子类可以继承类变量(public)、实例变量(public)
class Sub(Base):
    def print_public_var(self):
        print(self.Public_class_var)

    def print_public_instance_var(self):
        print(self.public_instance_var)

sub=Sub()
sub.print_public_var()
public class var

sub.print_public_instance_var()
public instance var

# 事实上凡是公有的都能继承,凡是私有的都不能继承
class Sub(Base):
    def print_public_class_method(self):
        print(self.public_class_method())

    def print_public_static_method(self):
        print(self.public_static_method())

    def print_public_instance_method(self):
        print(self.public_instance_method())

sub=Sub()
sub.print_public_class_method()
public class method
sub.print_public_static_method()
public static method
sub.print_public_instance_method()
public instance method

4. classmethod、staticmethod

class A(object):
    def foo(self,x):
        print("executing foo({},{})".format(self,x))

    @classmethod
    def class_foo(cls,x):
        print("executing class_foo({},{})".format(cls,x))

    @staticmethod
    def static_foo(x):
        print("executing static_foo({})".format(x))

a=A()

a.foo(1)
executing foo(<__main__.A object at 0x7fe8619c7160>,1)

a.class_foo(1)
executing class_foo(<class ‘__main__.A‘>,1)

a.static_foo(1)
executing static_foo(1)

a.static_foo(‘hi‘)
executing static_foo(hi)

A.class_foo(1)
executing class_foo(<class ‘__main__.A‘>,1)

A.static_foo(1)
executing static_foo(1)

A.foo(1)TypeError: foo() missing 1 required positional argument: ‘x‘

print(a.foo)
<bound method A.foo of <__main__.A object at 0x7f57d0ba41d0>>

print(a.class_foo)
<bound method A.class_foo of <class ‘__main__.A‘>>

print(a.static_foo)
<function A.static_foo at 0x7f71b0c89b70>

参考文章

《Python3文档——类》

《极客学院——从零开始学python——类(3)》

《廖雪峰——面向对象——访问限制》

时间: 2024-10-13 06:36:26

[PY3]——面向对象编程(1)的相关文章

面向对象编程

面向对象:类,属性,方法 面向对象最重要的概念就是类(Class)和实例(Instance),必须牢记类是抽象的模板,比如Student类,而实例是根据类创建出来的一个个具体的"对象",每个对象都拥有相同的方法,但各自的数据可能不同. 仍以Student类为例,在Python中,定义类是通过class关键字: class Student(object): pass class后面紧接着是类名,即Student,类名通常是大写开头的单词,紧接着是(object),表示该类是从哪个类继承下

python面向对象编程

java和c#只支持面向对象编程,python即可支持面向对象也可以支持函数式编程. 面向对象两个重要的概念:  1.类 2.对象 函数式 def sendemail(email,msg):            函数 print("8888") 面向对象 class Myclass: def sendmail(self,email,msg):      函数定义在类中第一个参数必须是self print("8888")              函数在类中定义叫方

面向对象编程的一些理解

(1) 简单的说类是对象的模版. 首先我们可以来理解一下对象的概念,面向对象编程的程序实际就是多个对象的集合,我们可以把所有的事物都抽象成对象,在程序设计中可以看作:对象=属性+方法.属性就是对象的数据,而方法就是对象的行为. 下面来说类,就像我开头所说类是对象的模版,而对象是类的实例化.举个例子,饼干模子可以看作是类,而具体的饼干就是对象.再比如有一个类是表示人,然后可以通过人这个模版来实例化出张三.李四... 比如说一个类是描述人的特征,为什么实例化? p = People(); 这个人有很

Python之路【第五篇】:面向对象编程

面向对象编程思维导向图 http://naotu.baidu.com/file/03516c91377d6cad0ded041aa4ce4433?token=ccaba09527261666 密码: Tim 面向:过程.函数.对象 面向过程:根据业务逻辑从上到下写垒代码! 面向过程的编程弊:每次调用的时候都的重写,代码特别长,代码重用性没有,每次增加新功能所有的代码都的修改!那有什么办法解决上面出现的弊端呢?函数就出现了. 面向函数:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可!

C++ Primer 学习笔记_73_面向对象编程 --再谈文本查询示例

面向对象编程 --再谈文本查询示例 引言: 扩展第10.6节的文本查询应用程序,使我们的系统可以支持更复杂的查询. 为了说明问题,将用下面的简单小说来运行查询: Alice Emma has long flowing red hair. Her Daddy says when the wind blows through her hair, it looks almost alive, like a fiery bird in flight. A beautiful fiery bird, he

C++ Primer 学习笔记_74_面向对象编程 --再谈文本查询示例[续/习题]

面向对象编程 --再谈文本查询示例[续/习题] //P522 习题15.41 //1 in TextQuery.h #ifndef TEXTQUERY_H_INCLUDED #define TEXTQUERY_H_INCLUDED #include <iostream> #include <fstream> #include <sstream> #include <vector> #include <set> #include <map&g

面向对象编程---图片轮播

今天复习了一下面向对象编程,下面是我的效果图 看着这个图片你会觉得这没有什么,那么上代码: html部分: 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Document</title> 6 <style> 7 ul,ol,li{padding:0;margin:0;li

《Java面向对象编程第二版》今年出版以来获得读者一致好评。

<Java面向对象编程第一版>自2016年出版以来,承蒙读者们的厚爱,至今已经重印了二十多次,成为国内Java领域里的经典Java技术宝典.在当当网上获得了1500多条好评: http://product.dangdang.com/9186890.html?point=comment_point 应广大读者的要求,为第一版进行了升级,第二版融合了最新的Java8的语言特性,它继续为Java开发人员们提供丰富全面的技术支持和帮助.在京东网上读者们对第二版的好评如潮,一致认为这是Java开发人员必

面向对象编程与面向过程编程的区别与联系

LinuxC编程的学习已经告一段落,这段开始学C++.C++是面向对象编程,C语言是面向过程编程.因此学习C++的第一件事就是要弄明白什么是面向过程编程,什么是面向对象编程. 之前学习的C语言是面向过程编程,回想一下C语言编程的过程.主函数,定义变量,调用函数然后实现.面向过程编程是一种非常具体,要面面俱到的的编程方式.而面向对象是以对象为单位来进行编程,比较像正常人的思维. 下面我们举个例子,比如开车.加速.减速.刹车. 用面向过程来说就是你要先有一个车,然后这四个分别是4件事,也就是说你要写